public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response) {
response.setContentType("text/html");
response.setCharacterEncoding("UTF-8"); // 设置编码方式
Person person = new Person();
PersonService personDao = new PersonService();
List personList = personDao.queryPersons(person); // 查询
HttpSession session = request.getSession();
session.setAttribute("personList", personList); // 将查询结果列表放到当前的Session中
return mapping.findForward("success"); // 跳转到success代表视图(.vm)
}
}
这时,在看一下如何在struts-config.xml中配置Action和目标视图,其实和普通的Struts配置是一样的,只是把以前使用的JSP作为视图,前部替换为Velocity视图,如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<!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-sources />
<form-beans />
<global-exceptions />
<global-forwards />
<action-mappings >
<action
path="/searchPerson"
scope="request"
type="org.shirdrn.struts.action.SearchPersonAction">
<forward name="success" path="/templates/show.vm"></forward>
</action>
</action-mappings>
<message-resources parameter="org.shirdrn.struts.ApplicationResources" />
</struts-config>
这里,show.vm是Velocity模板,就是使用表格显示数据,内容如下所示:
<html>
<head>
<title>Velocity与Servlet集成</title>
</head>
<body border="2" borderColor="#000000">
<h1>Velocity与Servlet集成的例子</h1>
<table bgcolor="#32CD32" align="center" width="60%" cellspacing="1" cellpadding="1">
<tr>
<td>ID</td>
<td>姓名</td>
<td>性别</td>
<td>年龄</td>
<td>住址</td>
</tr>
#foreach($person in $personList)
<tr>
<td>$!person.id</td>
<td>$!person.name</td>
<td>$!person.gender</td>
<td>$!person.age</td>
<td>$!person.addr</td>
</tr>
#end
</table>
</body>
</html>
要使用Velocity的toolbox.xml中配置当前可用的工具集,其实toolbox.xml中指定的工具都可以在本应用中加载使用。
工具箱toolbox.xml中配置了Velocity与Struts集成可用的工具,具体内容如下所示:
<?xml version="1.0"?>
<toolbox>
<tool>
<key>link</key>
<scope>request</scope>
<class>
org.apache.velocity.tools.struts.StrutsLinkTool
</class>
</tool>
<tool>
<key>msg</key>
<scope>request</scope>
<class>
org.apache.velocity.tools.struts.MessageTool
</class>
</tool>
<tool>
<key>errors</key>
<scope>request</scope>
<class>
org.apache.velocity.tools.struts.ErrorsTool
</class>
</tool>
<tool>
<key>form</key>
<scope>request</scope>
<class>
org.apache.velocity.tools.struts.FormTool
</class>
</tool>
<tool>
<key>tiles</key>
<scope>request</scope>
<class>
org.apache.velocity.tools.struts.TilesTool
</class>
</tool>
<tool>
<key>validator</key>
<scope>request</scope>
<class>
org.apache.velocity.tools.struts.ValidatorTool
</class>
</tool>
</toolbox>
注意:在本文中并没有使用到toolbox.xml中指定的任何一个工具,将其去掉仍然能够测试运行。
最后,就是配置web.xml了,一定要映射请求*.vm视图时指定的org.apache.velocity.tools.view.servlet.VelocityViewServlet,这点很重要,否则无法派发视图。web.xml的配置如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.4" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<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>
<init-param>
<param-name>debug</param-name>
<param-value>3</param-value>
</init-param>
<init-param>
<param-name>detail</param-name>
<param-value>3</param-value>
</init-param>
<load-on-startup>0</load-on-startup>
</servlet>
<servlet>
<servlet-name>velocity</servlet-name>
<servlet-class>org.apache.velocity.tools.view.servlet.VelocityViewServlet</servlet-class>
<init-param>
<param-name>org.apache.velocity.toolbox</param-name>
<param-value>/WEB-INF/toolbox.xml</param-value>
</init-param>
<load-on-startup>10</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>action</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>velocity</servlet-name>
<url-pattern>*.vm</url-pattern>
</servlet-mapping>
</web-app>
现在,可以测试Velocity与Struts集成的结果了。
在浏览器地址栏中键入链接:
http://localhost:8080/VelocityStruts/searchPerson.do
可以看到视图显示的列表结果,如下所示:
Velocity与Struts集成的例子
ID | 姓名 | 性别 | 年龄 | 住址 |
200804140001 | shirdrn | male | 25 | ChangChun |
200804150001 | Poolina | female | 24 | Changchun |
200804150002 | Seliby | male | 25 | Changchun |
200804150006 | Koppa | female | 24 | Changchun |
200804150008 | Justin | male | 24 | New York |
200804150009 | Soloor | female | 24 | London |
200804150015 | Sujnn | male | 22 | Shanghai |
200804160001 | SAgoop | |||
200804160002 | SAgoop | |||
200804160003 | SAgoop | |||
200804160004 | SAgoop | |||
200804160005 | SAgoop | |||
200804160006 | SAgoop | |||
200804160007 | SAgoop | |||
200804160008 | SAgoop | |||
200804160009 | SAgoop | |||
200804160010 | SAgoop | |||
200804160011 | SAgoop | |||
200804160012 | SAgoop | |||
200804160013 | SAgoop | |||
200804160014 | SAgoop | |||
200804160015 | SAgoop | |||
200804160016 | SAgoop | |||
200804160017 | SAgoop | |||
200804160018 | SAgoop | |||
200804160019 | 异域王者 | 男 | 20 | Beijing |
200804160021 | 异域王者 | 男 | 20 | Beijing |
200804160022 | 风平浪静 | female | 22 | 长春 |
200804160023 | 风平浪静 | female | 22 | 长春 |
200804160024 | 异域王者 | 男 | 20 | Beijing |
200804170001 | 异域王者 | female | 20 | Beijing |
200804170030 | 飞鱼 | 男 | 20 | Beijing |
200804170032 | 飞鱼 | 男 | 20 | Beijing |
200804170033 | 飞鱼 | 男 | 20 | Beijing |
200804170035 | 飞鱼 | 男 | 20 | Beijing |
心得总结
Velocity与Struts集成,Velocity主要是根据toolbox.xml中指定的工具来替代Struts,比如替代Struts标签,因为Velocity模板非常简洁。
Velocity与Struts集成,对于Velocity的属性文件velocity.properties使用Velocity自带的,而无需我们自己去配置。如果单独配置Velocity的属性文件velocity.properties,对于中文需要在其中设置编码。而Velocity与Struts集成了,编码的设置可以放到Action中进行设置,或者使用Servlet为本应用统一设置一个单独的编码过滤器。
Velocity与Struts集成,不需要单独进行模板的获取(比如单独使用Velocity,像在文章 VelocityServlet的应用 中需要通过Velocity上下文显式获取Velocity模板)。