Struts2能够自动为Action的属性赋值,也能为属性的属性即POJO的属性赋值。Struts2中推荐使用POJO,这样面对对象化会更好一些,也更简单。相对于Struts1.x中使用POJO。Struts2.x更贴心一些。
1.图书馆Action
虽然普通的javaBean也可以用做Action,但是最好跟业务中的POJO区分开来,例如,这里使用Book作为业务POJO类,使用BookAction作为Action类,里面包含一个Book类型的属性,用于接受浏览器提交的数据。BookAction定义了3种操作:显示添加书籍页面、添加书籍、列出所有书籍、清空书籍。代码如下:
package com.action;
import java.util.ArrayList;
import java.util.List;
import com.javaBean.Book;
public class BookAction {
public static List<Book> bookList = new ArrayList<Book>();
private String title;
private Book book;
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public Book getBook() {
return book;
}
public void setBook(Book book) {
this.book = book;
}
public String initAdd(){
return "initAdd";
}
public String add(){
bookList.add(book);
title ="<br/><br/>添加书籍成功<br/><br/>";
return "success";
}
public String list(){
return "list";
}
public String clear(){
bookList.clear();
title= "<br/><br/>清空书籍列表成功<br/><br/>";
return "list";
}
public List<Book> getBookList(){
return bookList;
}
}
这里BokAction并没有实现Action接口,也没有继承自ActionSupport类。
提示:Struts1.x使用POJO时,必须使用new显示地创建一个对象。而Struts2.不需要,如果没有对象,会在运行时通过反射实例化一个对象,因此不会抛出NullPointerException。
补充:Struts1.x的代码:
package com.action;
import java.util.ArrayList;
import java.util.List;
import com.javaBean.Book;
public class BookAction {
public static List<Book> bookList = new ArrayList<Book>();
private String title;
private Book book = new Book();//必须new出来一个对象,否则会抛出 NullPointerException
....................下同
}
2.图书实体Book类
看一下业务POJO类Book。Book中包含3个属性:书名、作者以及Date类型的出版日期。Struts2.x也能自动转化Date类型数据、Struts2.x有一个迷人的日期类型转化器,但是功能有限,只能转化形如“2008-08-08”的日期,如果转化失败,还会抛出异常。
代码:
package com.javaBean;
import java.sql.Date;
public class Book {
private String name;//书名
private String author;//作者
private Date publishedDate;//出版日期
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
public Date getPublishedDate() {
return publishedDate;
}
public void setPublishedDate(Date publishedDate) {
this.publishedDate = publishedDate;
}
}
BookAction中没有任何操作Book属性的代码。Struts2自动完成Book属性的赋值,通过getter方法设置到Book对象中。
3.通配符配置Action
Struts2.x也支持通配符配置Action。例如在action名称中使用“*”配置action名称,可以使用多个“*”。“*”代表的内容也可以在本Action配置内部使用{1}、{2}等引用,其中{1}表示第一个“*”内容,{2}表示第二个“*”的内容,依次类推。例如BookAction的配置:
<action name="*Book" class="com.action.BookAction" method="{1}">
<result>/successBook.jsp</result>
<result name="{1}">{1}Book.jsp</result>
<result name="input">/initAddBook.jsp</result>
<result name="list">/listBook.jsp</result>
</action>
提示:这里把method属性用通配符定义为{1},表示使用initAddBook.action访问时,执行initAdd()方法,使用llistBook.action访问时,执行list()。
4.jsp添加、列表页面
jsp中使用Struts2标签显示数据。仍然使用Struts2表单标签生成默认的页面布局。显示URL时使用的是<struts:url/>标签,该标签会在运行时将“.action”自动添加在后面。如果Struts.properties中修改了“.action”后缀,该标签也会自动添加为新的后缀。添加书籍的页面代码如下:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib uri="/struts-tags" prefix="s"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
</head>
<body>
<a href="<s:url action="initAddBook"/>">添加数据</a><!-- URL标签引用 -->
<a href="<s:url action="listBook"/>">书籍列表</a><!-- 自动添加“.action” -->
<a href="<s:url action="clearBook"/>">清空书籍列表</a>
<s:form action="addBook">
<s:label value="添加书籍"></s:label>
<s:textfield name="book.name" label="书名"></s:textfield>
<s:textfield name="book.author" label="作者"></s:textfield>
<s:textfield name="book.publishedDate" label="出版日期"></s:textfield>
<s:submit value="添加"></s:submit>
</s:form>
</body>
</html>
除了会追加“.action”后缀,<struts:url/>默认还会追加地址栏参数。有些时候这个特性很好用,但并不是所有情况下都合适。可以使用<s:url action="initAddBook" includeParams="none"/>将禁止本标签的自动追加参数特性。或者在struts.properties中禁止所有的<s:url/>的自动追加参数特性。代码为:
#禁止所有<struts:url/>标签的自动追加参数特性
struts.url.includeParams=none
添加成功页面很简单,只输出一句成功信息,这里省略了。书籍列表页面使用<s:iterator/>遍历Action的bookList,显示书名、作者。出版日期等。代码如下:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib uri="/struts-tags" prefix="s" %>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title><s:property value="title" escape="false"/></title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
</head>
<body>
<a href="<s:url action="initAddBook"/>">添加数据</a><!-- URL标签引用 -->
<a href="<s:url action="listBook"/>">书籍列表</a><!-- 自动添加“.action” -->
<a href="<s:url action="clearBook"/>">清空书籍列表</a>
<table>
<tr>
<th>书名</th>
<th>作者</th>
<th>出版日期</th>
</tr>
<s:iterator id="book" value="bookList">
<tr>
<td>${book.name }</td>
<td>${book.author }</td>
<td>${book.publishedDate }</td>
</tr>
</s:iterator>
</table>
<s:property value="title" escape="false"/>
</body>
</html>
注意: 本例使用了POJO作为Action类,没有继承ActionSupport,也没有实现IAction接口。但是如果要使用Struts2提供的数据验证、错误显示等,则仍需要继承ActionSupport类。