??xml version="1.0" encoding="utf-8" standalone="yes"?> 七、关于Struts-Menu配置文g和API的用方法,请参考附录中的官方网?/p>
6Q你的目录结构应该类似如下: 六、实战Struts-Menu 3Q结合数据库实现动态菜?br />
> 新徏数据myexamplesQ?br />
CREATE DATABASE myexamples 二、运行环?br />
Windows 2000 Professional 三、下载与安装 四、运行示例程?br />
1Q安装好Tomcat后,解压~struts-menu-2.3.zipQ将struts-menu.war释放到Tomcat安装目录下的webapps下,q行Tomcat 五、安装与配置
]]>
]]>
]]>
]]>
]]>
]]><%@ page contentType="text/html; charset=GBK" %>
<%@ taglib uri="struts-menu" prefix="menu" %>
<p>没有使用Bundle和权限控?
<menu:useMenuDisplayer name="ListMenu" repository="examplesRepository">
<menu:displayMenu name="DatabaseMenu"/>
<menu:displayMenu name="StandaloneMenu"/>
</menu:useMenuDisplayer></p>
<p>使用Bundle, 没有使用权限控制:
<menu:useMenuDisplayer name="ListMenu" bundle="examplesBundle" repository="examplesRepository">
<menu:displayMenu name="DatabaseMenu"/>
<menu:displayMenu name="StandaloneMenu"/>
</menu:useMenuDisplayer></p>
<p>使用Bundle和权限控?
<menu:useMenuDisplayer name="ListMenu" permissions="examplesPermession" bundle="examplesBundle" repository="examplesRepository">
<menu:displayMenu name="DatabaseMenu"/>
<menu:displayMenu name="StandaloneMenu"/>
</menu:useMenuDisplayer></p>
附:
Struts-Menu官方|站Q?a >http://struts-menu.sourceforge.net
数据库驱动的动态菜单:http://demo.raibledesigns.com/struts-menu/dynamicMenu.jsp
]]>
* 从数据库中读取菜单配|信?br />
*
* @return
*/
private Map[] getMenuComponents() {
ArrayList list = new ArrayList();
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rest = null;
String sql = "select name,parent_name,title,location,description from menu_item order by id";
try {
Class.forName("com.mysql.jdbc.Driver").newInstance();
conn = DriverManager.getConnection("jdbc:mysql://localhost/myexamples?user=root&password=mywangya&useUnicode=true&characterEncoding=UTF-8");
pstmt = conn.prepareStatement(sql);
rest = pstmt.executeQuery();
while (rest.next()) {
int i = 1;
HashMap map = new HashMap();
map.put("name", rest.getString(i++));
map.put("parent_name", rest.getString(i++));
map.put("title", rest.getString(i++));
map.put("location", rest.getString(i++));
map.put("description", rest.getString(i++));
list.add(map);
}
} catch (SQLException ex) {
ex.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} finally {
try {
if (null!=rest) rest.close();
if (null!=pstmt) pstmt.close();
if (null!=conn) conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
return (Map[]) list.toArray(new HashMap[0]);
}
/**
* 构造菜单权?br />
*
* @param request
*/
private void buildMenuPermissions(HttpServletRequest request) {
PermissionsAdapter permession = new PermissionsAdapter() {
public boolean isAllowed(MenuComponent menu) {
// 名称{于StandaloneMenu的菜单不昄
return !"StandaloneMenu".equalsIgnoreCase(menu.getName());
}
};
request.setAttribute("examplesPermession", permession);
}
/**
* 构造菜单显C标?br />
*
* @param request
*/
private void buildMenuResourceBundle(HttpServletRequest request) {
MenuResourceBundle resourceBundle = new MenuResourceBundle();
request.setAttribute("examplesBundle", resourceBundle);
}
/**
* MenuResourceBundle树状菜单国际语言昄
*
* @author wenbin.zhang
*
*/
class MenuResourceBundle extends ListResourceBundle {
private ArrayList list = new ArrayList();
public MenuResourceBundle() {
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rest = null;
String sql = "select title,titleCN from menu_item order by id";
try {
Class.forName("com.mysql.jdbc.Driver").newInstance();
conn = DriverManager.getConnection("jdbc:mysql://localhost/myexamples?user=root&password=mywangya&useUnicode=true&characterEncoding=UTF-8");
pstmt = conn.prepareStatement(sql);
rest = pstmt.executeQuery();
while (rest.next()) {
int i = 1;
String[] message = new String[2];
message[0] = rest.getString(i++);
try {
message[1] = new String(rest.getString(i++).getBytes("latin1"), "gbk");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
if (message[0] != null && message[1] != null) {
list.add(message);
}
}
} catch (SQLException ex) {
ex.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} finally {
try {
if (null!=rest) rest.close();
if (null!=pstmt) pstmt.close();
if (null!=conn) conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
public Object[][] getContents() {
return (String[][]) list.toArray(new String[0][0]);
}
}
}
> struts-config.xml文g?lt;action-mappings />部分修改为:
<action path="/menuAction" type="cn.appex.menu.MenuAction" >
<forward name="success" path="/struts-menu/dynamic-menu.jsp" />
</action>
</action-mappings>
]]>INSERT INTO menu_item
(id, parent_name, name, title, titleCN, location)
VALUES
(1,null,'DatabaseMenu','Database Menu','数据库动态菜?,null),
(2,'DatabaseMenu','Yahoo','Yahoo Mail','雅虎邮g','http://mail.yahoo.com'),
(3,'DatabaseMenu','JavaBlogs','JavaBlogs','Java博客','http://javablogs.com'),
(4,null,'StandaloneMenu','Standalone Menu','独立的菜?,'http://www.sohu.com')
> 新徏一个Struts的ActionQ代码如下:
import java.io.UnsupportedEncodingException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.ListResourceBundle;
import java.util.Map;
import com.mysql.jdbc.Driver;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import net.sf.navigator.menu.MenuComponent;
import net.sf.navigator.menu.MenuRepository;
import net.sf.navigator.menu.PermissionsAdapter;
import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
public class MenuAction extends Action {
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
throws Exception {
buildMenuRepository(request);
buildMenuResourceBundle(request);
buildMenuPermissions(request);
return (mapping.findForward("success"));
}
/**
* 创徏菜单数据l构
*
* @param request
*/
private void buildMenuRepository(HttpServletRequest request) {
MenuRepository repository = new MenuRepository();
// Get the repository from the application scope - and copy the
// DisplayerMappings from it.
MenuRepository defaultRepository = (MenuRepository) request
.getSession().getServletContext().getAttribute(
MenuRepository.MENU_REPOSITORY_KEY);
repository.setDisplayers(defaultRepository.getDisplayers());
Map[] menus = getMenuComponents();
for (int i=0; i < menus.length; i++) {
MenuComponent mc = new MenuComponent();
Map row = menus[i];
String name = (String) row.get("name");
mc.setName(name);
String parent = (String) row.get("parent_name");
System.out.println(name + ", parent is: " + parent);
if (parent != null) {
MenuComponent parentMenu = repository.getMenu(parent);
if (parentMenu == null) {
System.out.println("parentMenu '" + parent + "' doesn't exist!");
// create a temporary parentMenu
parentMenu = new MenuComponent();
parentMenu.setName(parent);
repository.addMenu(parentMenu);
}
mc.setParent(parentMenu);
}
String title = (String) row.get("title");
mc.setTitle(title);
String location = (String) row.get("location");
mc.setLocation(location);
String description = (String) row.get("description");
mc.setDescription(description);
repository.addMenu(mc);
}
request.setAttribute("examplesRepository", repository);
}
]]>
<MenuConfig>
<Displayers>
<Displayer name="DropDown"
type="net.sf.navigator.displayer.DropDownMenuDisplayer"/>
<Displayer name="Simple"
type="net.sf.navigator.displayer.SimpleMenuDisplayer"/>
<Displayer name="CoolMenu"
type="net.sf.navigator.displayer.CoolMenuDisplayer"/>
<Displayer name="CoolMenu4"
type="net.sf.navigator.displayer.CoolMenuDisplayer4"/>
<Displayer name="MenuForm"
type="net.sf.navigator.example.PermissionsFormMenuDisplayer"/>
<Displayer name="ListMenu"
type="net.sf.navigator.displayer.ListMenuDisplayer"/>
<Displayer name="TabbedMenu"
type="net.sf.navigator.displayer.TabbedMenuDisplayer"/>
<Displayer name="Velocity"
type="net.sf.navigator.displayer.VelocityMenuDisplayer"/>
</Displayers>
<Menus>
<Menu name="DoorSite" title="DoorSite" description="Some famous doorsite" width="50">
<Item name="Yahoo" title="Yahoo">
<Item name="YahooIndex" title="Yahoo Index" location="http://www.yahoo.com.cn"/>
<Item name="YahooMail" title="Yahoo Mail" location="http://cn.mail.yahoo.com"/>
</Item>
<Item name="Sohu" title="Sohu" location="http://www.sohu.com"/>
<Item name="Sina" title="Sina" location="http://www.sina.com.cn"/>
</Menu>
</Menus>
</MenuConfig>
%PROJECT_HOME%\lib
%PROJECT_HOME%\lib\antlr.jar
%PROJECT_HOME%\lib\commons-beanutils.jar
%PROJECT_HOME%\lib\commons-digester.jar
%PROJECT_HOME%\lib\commons-fileupload.jar
%PROJECT_HOME%\lib\commons-lang-2.1.jar
%PROJECT_HOME%\lib\commons-logging.jar
%PROJECT_HOME%\lib\commons-validator.jar
%PROJECT_HOME%\lib\jakarta-oro.jar
%PROJECT_HOME%\lib\jstl-1.0.6.jar
%PROJECT_HOME%\lib\standard-1.0.6.jar
%PROJECT_HOME%\lib\struts.jar
%PROJECT_HOME%\lib\struts-menu-2.3.jar
%PROJECT_HOME%\src
%PROJECT_HOME%\src\log4j.properties
%PROJECT_HOME%\src\application.properties
%PROJECT_HOME%\src\application_zh_CN.properties
%PROJECT_HOME%\web
%PROJECT_HOME%\web\images\
%PROJECT_HOME%\web\scripts\
%PROJECT_HOME%\web\styles\
%PROJECT_HOME%\web\WEB-INF
%PROJECT_HOME%\web\WEB-INF\menu-config.xml
%PROJECT_HOME%\web\WEB-INF\struts-bean.tld
%PROJECT_HOME%\web\WEB-INF\struts-config.xml
%PROJECT_HOME%\web\WEB-INF\struts-html.tld
%PROJECT_HOME%\web\WEB-INF\struts-logic.tld
%PROJECT_HOME%\web\WEB-INF\struts-menu.tld
%PROJECT_HOME%\web\WEB-INF\struts-menu-el.tld
%PROJECT_HOME%\web\WEB-INF\struts-nested.tld
%PROJECT_HOME%\web\WEB-INF\struts-tiles.tld
%PROJECT_HOME%\web\WEB-INF\web.xml
1Q用配|文件实现静态菜?br />
新徏JSP文gweb/static-menu.jspQ内容如下:
<%@ taglib uri="struts-menu" prefix="menu" %>
<menu:useMenuDisplayer name="ListMenu"
bundle="org.apache.struts.action.MESSAGE">
<menu:displayMenu name="DoorSite"/>
</menu:useMenuDisplayer>
2Q实C文化
> 在src\application_zh_CN.properties中增加下面的内容QUnicode可以通过JDK自带的native2ascii工具得到Q?br />
menu.DoorSite=\u95e8\u6237\u7f51\u7ad9
#雅虎
menu.Yahoo=\u96c5\u864e
#雅虎首页
menu.YahooIndex=\u96c5\u864e\u9996\u9875
#雅虎邮g
menu.YahooMail=\u96c5\u864e\u90ae\u4ef6
#搜狐
menu.Sohu=\u641c\u72d0
#新浪
menu.Sina=\u65b0\u6d6a
menu.DoorSite=DoorSite
#雅虎
menu.Yahoo=Yahoo
#雅虎首页
menu.YahooIndex=Yahoo Index
#雅虎邮g
menu.YahooMail=Yahoo Mail
#搜狐
menu.Sohu=Sohu
#新浪
menu.Sina=Sina
<Menu name="DoorSite" title="menu.DoorSite" description="Some famous doorsite" width="50">
<Item name="Yahoo" title="menu.Yahoo">
<Item name="YahooIndex" title="menu.YahooIndex" location="http://www.yahoo.com.cn"/>
<Item name="YahooMail" title="menu.YahooMail" location="http://cn.mail.yahoo.com"/>
</Item>
<Item name="Sohu" title="menu.Sohu" location="http://www.sohu.com"/>
<Item name="Sina" title="menu.Sina" location="http://www.sina.com.cn"/>
</Menu>
</Menus>
> 新徏数据库表menu_itemQ?br />
CREATE TABLE menu_item (
id BIGINT not null,
parent_name VARCHAR(30),
name VARCHAR(30),
title VARCHAR(30),
titleCN VARCHAR(30),
description VARCHAR(50),
location VARCHAR(255),
target VARCHAR(10),
onclick VARCHAR(100),
onmouseover VARCHAR(100),
onmouseout VARCHAR(100),
image VARCHAR(50),
altImage VARCHAR(30),
tooltip VARCHAR(100),
roles VARCHAR(100),
page VARCHAR(255),
width VARCHAR(5),
height VARCHAR(5),
forward VARCHAR(50),
action VARCHAR(50),
primary key (id)
)
]]>
JDK 1.4.2_03
Eclipse 3.1
Tomcat 5.0.28
Tomcat Plugin 3.1Beta
Struts 1.2.7
Commons-Lang 2.1
Commons-Collections 3.1
Struts-Menu 2.3
MySQL 4.1.10a-nt
1Q从http://java.sun.com下蝲J2SDKQ当?.4.xpd的最新版本ؓ1.4.2_08
2Q从http://www.eclipse.org下蝲EclipseQ当前最新版本ؓ3.1正式?br />
3Q从http://jakarta.apache.org/tomcat下蝲TomcatQ当?.xpd的最新版本ؓ5.0.28
4Q从http://www.sysdeo.com/eclipse/tomcatplugin下蝲Eclipse的Tomcat插gQ对应Eclipse3.1x的最新版本ؓ3.1Beta
5Q从http://struts.apache.org下蝲StrutsQ当前最新版本ؓ1.2.7
6Q从http://jakarta.apache.org/commons/下蝲Commons-LangQ当前最新版本ؓ2.1Q下载Commons-CollectionsQ当前最新版本ؓ3.1
7Q从http://struts-menu.sourceforge.net下蝲Struts MenuQ当前最新版本ؓ2.3
8Q从http://www.mysql.com下蝲MySQL数据库,4.xpd的最新版本是4.1.12a
9QMySQL、JDK、Eclipse、Tomcat和TomcatPlugin的安装及配置请参考相兌?/p>
2Q在地址栏输?a href="http://localhost:8080/struts-menu">http://localhost:8080/struts-menu
1Q在Eclipse中新建Tomcat目QContext?mymenuQSubdirectory?web
2Q在目目录下面新徏lib目录和web目录及WEB-INFQ在web/WEB-INF目录下新建web.xmlQ内容如下:
<!DOCTYPE web-app
PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app>
<display-name>My Example Application -- Vinton Lee</display-name>
<!-- ============= The Struts ActionServlet Configuration ============= -->
<servlet>
<servlet-name>action</servlet-name>
<servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
<init-param>
<param-name>config</param-name>
<param-value>/WEB-INF/struts-config.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<!-- ================================================================== -->
<!-- ============= The Struts Action Servlet Mapping ================== -->
<servlet-mapping>
<servlet-name>action</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
<!-- ================================================================== -->
<!-- The Welcome File List -->
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<!-- =============== The Struts Taglib Definition ===================== -->
<taglib>
<taglib-uri>struts-bean</taglib-uri>
<taglib-location>/WEB-INF/struts-bean.tld</taglib-location>
</taglib>
<taglib>
<taglib-uri>struts-html</taglib-uri>
<taglib-location>/WEB-INF/struts-html.tld</taglib-location>
</taglib>
<taglib>
<taglib-uri>struts-logic</taglib-uri>
<taglib-location>/WEB-INF/struts-logic.tld</taglib-location>
</taglib>
<taglib>
<taglib-uri>struts-nested</taglib-uri>
<taglib-location>/WEB-INF/struts-nested.tld</taglib-location>
</taglib>
<taglib>
<taglib-uri>struts-tiles</taglib-uri>
<taglib-location>/WEB-INF/struts-tiles.tld</taglib-location>
</taglib>
<!-- ================================================================== -->
<!-- ============= The Struts-Menu Taglib Definition ================== -->
<taglib>
<taglib-uri>struts-menu</taglib-uri>
<taglib-location>/WEB-INF/struts-menu.tld</taglib-location>
</taglib>
<!-- ================================================================== -->
</web-app>
<!DOCTYPE struts-config PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 1.2//EN"
"http://struts.apache.org/dtds/struts-config_1_2.dtd">
<struts-config>
<!-- ========== Data Source Configuration =============================== -->
<data-sources />
<!-- ========== Form Bean Definitions =================================== -->
<form-beans />
<!-- ========== Global Exception Definitions ============================ -->
<global-exceptions />
<!-- ========== Global Forward Definitions ============================== -->
<global-forwards />
<!-- ========== Action Mapping Definitions ============================== -->
<action-mappings />
<!-- ========== Controller Configuration ================================ -->
<!-- ========== Message Resources Definitions =========================== -->
<message-resources parameter="application" />
<!-- ========== Plug Ins Configuration ================================== -->
<plug-in className="net.sf.navigator.menu.MenuPlugIn">
<set-property property="menuConfig" value="/WEB-INF/menu-config.xml"/>
</plug-in>
</struts-config>
]]>
2.配置web.xml文g
加入org.apache.struts2.dispatcher.FilterDispatcherqo器的配置
FilterDispatcher是STRUTS2核心控制器。负责拦截所有的用户h?/span>
用户h的到达时QFilterqo用户h。如果用戯求以actionl尾Q请求将被{入struts2框架处理?br />
3.在classes下加入struts.xml文g
Struts.xml文g用来配置action,拦截器等?/span>
i.Struts-default.xml配置文g位于struts-core-2.0.x.jar包中。是struts2最核心的配|文件?/span>
ii.从中可以看到整个的struts的核心功能的全貌.
iii.Struts可以在result元素中指定相应的type属?默认jsp).从而支持其他的视图技术?/span>
v.包可以承其他的包。包可以定义命名I间Q用来区别其他配|文件中的相同的包名?/span>
vi.包可以定义成abstract=true q样包就只能被承,不能被框架直接实例化?/span>
vii.struts可以一个struts.xml文g分解成多个配|文Ӟ然后在struts.xml文g中包含其他配|文件?lt;struts><include file=”struts-partOne.xml”/></struts>
注意Q也可以在web.xml中配|filter时加入config参数来加载多个配|文件?/span>
3Qstruts.properties配置文g
该文件定义了struts2框架的大量属性。只要将该文件放在web应用的CLASSPATH下,struts2框架׃自动加蝲?/span>
stuts.locale
指定Web应用的默认Locale
struts.i18n.encoding
指定应用的默认编码相当于调用HttpServletRequest的setCharacterEncodingҎ?/span>
struts.custom.i18n.resources
指定struts应用所需要的国际化资源文件的名称Qmessage_zh_cn.properties只需要指定名为messageQ?/span>
struts.mutipart.parser
该属性处理mutipart/form-data的MIMEcdh的框Ӟcos|pell|jakartaQ默认是jakarta(common-fileupload)
struts.multipart.saveDir
指定上传文g的时保存\径,默认是javax.servlet.context.tempdir;
struts.multipart.maxSize
指定文g上传中整个请求内容允许的最大字节数?/span>
struts.action.extension
指定Struts处理h后缀Q默认是action(login.action)
struts.serve.static.browserCache
指定览器是否缓存静态内?/span>
struts.enable.SlashesInActionNames
该属性设|struts2是否允许在Action名中使用斜线Q该属性的默认值是false?/span>
struts.devMode
讄struts2是否使用开发模式(true|falseQ?/span>
struts.dispatcher.parametersWorkaround
对于不支持HttpServlertRequest调用getParameterMap()Ҏ的服务器Q可以设|该属性gؓtrue
来解册问题。不支持getParameterMap()Ҏ的服务器Qweblogic,orion,oc4j
struts.i18n.reload
讄是否每次HTTPh到达Ӟpȝ都重新加载资源文件。默认false
struts.ui.theme
讄视图标签的默认主题。默认是xhtml
struts.ui.templateDir
讄视图主题所需模板文g的位|,默认是template,默认加蝲template路径下的模板文g?/span>
struts.ui.templateSuffix
指定模板文g的后~Qftl|vm|jspQ?/span>
struts.configuration.xml.reload
讄当struts.xml文g改变后,pȝ是否自动重新加蝲?/span>
struts.configuration.files
指定默认加蝲的配|文Ӟ默认值是Qstruts-default.xml,struts-plugin.xml,struts.xml
struts.objectFactory
指定struts2默认的ObjectFactoryBean,该属性默认是spring
struts.objectFactory.spring.autoWire
指定Spring框架自动装配模式Q默认是name.x据Bean的name属性自动装配?/span>
struts.objectFactory.spring.userClassCache
指定spring框架是否~存Bean实例。默认是true
struts.objectTypeDeterminer (tiger|notiger)
?/span>Struts2中查?/span>vm文g的顺序先查找Web应用E序Q再查找c\径。如果你需要?/span>vm作ؓ昄层,只需要在配置文g中指?/span>result?/span>type属性ؓvelocityQ然后将<param>?/span>location属性指定到一个以vml尾的资源上可以了Q?/span>
1.Struts2中的Velocity中文q的处理方式:
因ؓ?/span>Velocity-1.4.jar中的org.apache.velocity.runtime.defaults中定义的velocity.properties中定义的input.encoding=ISO8859-1Q?/span>output.encoding=ISO8859-1Q通常最好在VM文g中?/span>%{getText(‘’)}调用国际化资源文件的内容׃会生ؕ码?/span>
2.Velocity?/span>vm文g必须要经q?/span>Action才可以访问,以便被程序解析,不可以直接访?/span>vm文g?/span>
3.?/span>vm文g中?/span>Struts2的标{֏需要在原有标签前加#s可以了Q参C间?/span>””分隔Q?/span>
(1.)例如下面是一个表单的定义Q?/span>
#sform(“action=Student” namespace=”/ilkj/student”)
#stextfield(“label=%{getText(‘student.label.name’)}” “name=student.name”)
#spassword(“label=%{getText(‘student.label.password’)} ” name=student.age”)
#ssubmit(“value=getText(‘globale.label.submit’)”)
#end
(2.)下面是取?/span>session中的一个参数的?/span>
#sproperty(“value=#session.information” “default=noValue”)
(3.)下面是访?/span>Action中的属?/span>
${student.name}Q当然你也可以简单写?/span>$student.name的Ş式?/span>
4.Velocity的内建变量:
stack---ValueStackQ可以?/span>${stack.findString(‘OGNL表达?/span>’)}取?/span>
action---最q执行的ActionQ例?/span>${action.getStudent().getName()}或者也可以直接?/span>${action.student.name}
response---HttpServletRequest
request---HttpServletResponse
session---HttpSession
application---ServletContext
base---生成应用的上下文Q相当与request.getContextPath()
5.注释语法
(1.)单行注释Q?/span>##
(2.)多行注释Q?/span>#* ... ... *#
6.暂停执行
#stop---停止执行后面的模板内?/span>
7.转义字符
Velocity使用 \ 转义字符Q例?/span>email被定义ؓandrew830314@163.comQ?/span>#set($email=’andrew830314@163.com’)Q,你还惌?/span>$email而不?/span>Velocity解析Q那么你可以使用 \$email?/span>
8.引入其他文g
#include(“”)Q如果是JSP或?/span>vm文g会昄内容Q其他文本文件显C文本,二进制会昄qQ引入多个文件?/span> , 间隔Q?/span>#parse(“”)引入一个本地的vm文gQ与#include(“”)不同Q?/span>#parse(“”)只能引入一个文Ӟq且#parse(“”)可以讉K父模杉K的变量?/span>
9.模板代码复用
#macro(代码D名U?/span> $参数1 ... ...)
... ...
#end
只要使用#代码D名U?/span>($参数1 ... ...)可以用这D代码,当然你也可以不用Q何参?/span>
10.判断语句
#if(逻辑表达?/span>)
注意Q在Velocity中?/span>==判断两个变量是否相等Q而不是?/span>equals(“”)Ҏ?/span>
#else
#end
从上面我们还可以ȝ出,Velocity模板引擎使用#表示一U命令,例如#set是给某个变量讄|使用$引用变量Q?/span>()表示参数Q?/span>{}表示作用范围?/span>
另外需要注意的时候,Velocity只会按照gettXXX()解析变脸变量Q例?/span>student.name实际上找到的student.getName()ҎQ你可以试着?/span>Action写一个变量而不使用getXXX()ҎQ看看会不会?/span>vm中取到|{案是变量会被原栯出?/span>
Velocity使用的都是对象,即你定?/span>#set ($count=1)也会被包装成Integer使用?/span>
另外Q修?/span>vm文g需要重新启动服务器Q如果在开发阶D,我们可以讄struts.properties中的struts.devMode=true避免每次重新启动服务器?/span>
最后我们思考一下,如果货币$2.95会被Velocity引擎直接输出Q还是去查找2.95q个变量Q如果你在思考这个问题,说明你的JAVA基础不过兛_Q因?/span>JAVA中的变量不能以数字开头的哦!因此你不必担心货?/span>$2.95会被当作变量解析Q另外,如果Velocity引擎未找到变量也会原栯出,例如${student.name}如果未找C直接原样输出Q这也是Z么我们直接访?/span>JSP的时候会看到大量?/span>${}被原栯出。如果变量不存在,你想让它不输?可以q样?!{}