使用 freemarker ,可以非常容易的用 ftl 文件来代替 jsp 文件,其他的架构不用变化。只需要在 SSH2 的基础上,添加额外配置:
1、添加jar包依赖:freemarker-x.x.x.jar
2、在 web.xml 中添加:
< servlet>
<servlet-name >freemarker </servlet-name >
<servlet-class >
freemarker.ext.servlet.FreemarkerServlet
</servlet-class >
<!-- FreemarkerServlet 设置: -->
<init-param >
<param-name >TemplatePath </param-name >
<param-value >/ </param-value >
</init-param >
<init-param >
<param-name >NoCache </param-name >
<param-value >true </param-value >
</init-param >
<init-param >
<param-name >ContentType </param-name >
<param-value >text/html; charset=UTF-8</ param-value>
<!-- 强制使用 UTF-8 作为输出编码格式! -->
</init-param >
<!-- FreeMarker 设置: -->
<init-param >
<param-name >template_update_delay </param-name >
<param-value >0 </param-value >
<!-- 0 只对开发使用! 否则使用大一点的值. -->
</init-param >
<init-param >
<param-name >default_encoding </param-name >
<param-value >UTF-8 </param-value >
<!-- 模板文件的编码方式. -->
</init-param >
<init-param >
<param-name >number_format </param-name >
<param-value >0.########## </param-value >
</init-param >
<load-on-startup >1 </load-on-startup >
</servlet >
<servlet-mapping >
<servlet-name >freemarker </servlet-name >
<url-pattern >*.ftl </url-pattern >
</servlet-mapping >
配置完成。
一个小 demo:
1、新建两个实体(均省略了所有变量的 setter 和 getter 方法):
Group:
package freemarker.test.entity;
public class Group {
private String name;
...
}
User:
package freemarker.test.entity;
import java.io.Serializable;
public class User implements Serializable {
private int id;
private String name;
private int age;
private Group group;
...
}
2、新建一个 action:
package ssh2.test.action;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import org.apache.struts2.ServletActionContext;
import org.springframework.stereotype.Controller;
import freemarker.test.entity.Group;
import freemarker.test.entity.User;
@Controller
public class PersonAction {
private String name1 = "AAAAA";
public String getName1() {
return name1;
}
public void setName1(String name1) {
this. name1 = name1;
}
public String execute(){
HttpServletRequest request = ServletActionContext.getRequest();
request.setAttribute( "name2", "BBBBB");
Map<String, Object> map = new HashMap<String, Object>();
Group group = new Group();
group.setName( "IT");
User user = new User();
user.setId(001);
user.setName( "张三");
user.setAge(12);
user.setGroup( group);
List<User> users = new ArrayList<User>();
users.add( user);
users.add( user);
users.add( user);
map.put( "user", user);
map.put( "users", users);
request.setAttribute( "map", map);
request.setAttribute( "user", user);
request.setAttribute( "users", users);
return "show";
}
}
3、struts.xml 中添加一个 action:
<package name = "person" namespace= "/person" extends= "struts-default" >
<action name = "show" class= "personAction">
<result name = "show" type= "freemarker" >/WEB-INF/ftl/person.ftl </result >
</action >
</package >
注意,返回页面是 .ftl 格式的。
4、返回页面 person.ftl :
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
Hello, my name is ${name!"default"}.</br>
访问私有变量:name1=${name1}</br>
访问 request 中的变量:name2=${name2} </br>
访问 request 中的映射: ${map.user.group.name}</br>
访问 request 中的集合:
</br>
<#list users as user>
- ${user.name}</br>
</#list>
</body>
</html>
输出:
函数私有变量(含有 getter 方法)和上下文中的变量,都可以被返回页面访问到。