Action中使用POJO

Struts2能够自动为Action的属性赋值,也能为属性的属性即POJO的属性赋值。Struts2中推荐使用POJO,这样面对对象化会更好一些,也更简单。相对于Struts1.x中使用POJO。Struts2.x更贴心一些。

 

1.图书馆Action

 

虽然普通的javaBean也可以用做Action,但是最好跟业务中的POJO区分开来,例如,这里使用Book作为业务POJO类,使用BookAction作为Action类,里面包含一个Book类型的属性,用于接受浏览器提交的数据。BookAction定义了3种操作:显示添加书籍页面、添加书籍、列出所有书籍、清空书籍。代码如下:

 

 

Java代码 复制代码  收藏代码
  1. package com.action;   
  2.   
  3. import java.util.ArrayList;   
  4. import java.util.List;   
  5.   
  6. import com.javaBean.Book;   
  7.   
  8. public class BookAction {   
  9.     public static List<Book> bookList = new ArrayList<Book>();   
  10.     private String title;   
  11.     private Book book;   
  12.     public String getTitle() {   
  13.         return title;   
  14.     }   
  15.     public void setTitle(String title) {   
  16.         this.title = title;   
  17.     }   
  18.     
  19.     public Book getBook() {   
  20.         return book;   
  21.     }   
  22.     public void setBook(Book book) {   
  23.         this.book = book;   
  24.     }   
  25.     public String initAdd(){   
  26.         return "initAdd";   
  27.     }   
  28.     public String add(){   
  29.         bookList.add(book);   
  30.         title ="<br/><br/>添加书籍成功<br/><br/>";   
  31.         return "success";   
  32.     }   
  33.     public String list(){   
  34.         return "list";   
  35.     }   
  36.     public String  clear(){   
  37.         bookList.clear();   
  38.         title= "<br/><br/>清空书籍列表成功<br/><br/>";   
  39.         return "list";   
  40.     }   
  41.     public List<Book> getBookList(){   
  42.         return bookList;   
  43.     }   
  44.   
  45. }  
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的代码:

 

 

Java代码 复制代码  收藏代码
  1. package com.action;   
  2.   
  3. import java.util.ArrayList;   
  4. import java.util.List;   
  5.   
  6. import com.javaBean.Book;   
  7.   
  8. public class BookAction {   
  9.     public static List<Book> bookList = new ArrayList<Book>();   
  10.     private String title;   
  11.     private Book book = new Book();//必须new出来一个对象,否则会抛出 NullPointerException   
  12.   
  13.            ....................下同   
  14.   
  15.   
  16. }  
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”的日期,如果转化失败,还会抛出异常。

 

代码:

 

 

Java代码、
package com.javaBean;   
  
  1. import java.sql.Date;   
  2.   
  3. public class Book {   
  4.       private String name;//书名   
  5.       private String author;//作者   
  6.       private Date publishedDate;//出版日期   
  7.     public String getName() {   
  8.         return name;   
  9.     }   
  10.     public void setName(String name) {   
  11.         this.name = name;   
  12.     }   
  13.     public String getAuthor() {   
  14.         return author;   
  15.     }   
  16.     public void setAuthor(String author) {   
  17.         this.author = author;   
  18.     }   
  19.     public Date getPublishedDate() {   
  20.         return publishedDate;   
  21.     }   
  22.     public void setPublishedDate(Date publishedDate) {   
  23.         this.publishedDate = publishedDate;   
  24.     }   
  25.          
  26. }  
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的配置:

 

 

Java代码 复制代码  收藏代码
  1. <action name="*Book" class="com.action.BookAction" method="{1}">   
  2.         <result>/successBook.jsp</result>   
  3.         <result name="{1}">{1}Book.jsp</result>   
  4.         <result name="input">/initAddBook.jsp</result>   
  5.         <result name="list">/listBook.jsp</result>   
  6. </action>  
<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”后缀,该标签也会自动添加为新的后缀。添加书籍的页面代码如下:

 

 

 

Java代码 复制代码  收藏代码
  1. <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>   
  2. <%@ taglib uri="/struts-tags" prefix="s"%>   
  3. <%   
  4. String path = request.getContextPath();   
  5. String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";   
  6. %>   
  7.   
  8. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">   
  9. <html>   
  10.   <head>   
  11.     <base href="<%=basePath%>">   
  12.     <meta http-equiv="pragma" content="no-cache">   
  13.     <meta http-equiv="cache-control" content="no-cache">   
  14.     <meta http-equiv="expires" content="0">       
  15.     <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">   
  16.     <meta http-equiv="description" content="This is my page">   
  17.     <!--   
  18.     <link rel="stylesheet" type="text/css" href="styles.css">   
  19.     -->   
  20.      
  21.   </head>   
  22.      
  23.   <body>   
  24.      <a href="<s:url action="initAddBook"/>">添加数据</a><!-- URL标签引用 -->   
  25.      <a href="<s:url action="listBook"/>">书籍列表</a><!-- 自动添加“.action” -->   
  26.      <a href="<s:url action="clearBook"/>">清空书籍列表</a>   
  27.      <s:form action="addBook">   
  28.         <s:label value="添加书籍"></s:label>   
  29.         <s:textfield name="book.name" label="书名"></s:textfield>   
  30.         <s:textfield name="book.author" label="作者"></s:textfield>   
  31.         <s:textfield name="book.publishedDate" label="出版日期"></s:textfield>   
  32.         <s:submit value="添加"></s:submit>   
  33.      </s:form>   
  34.   </body>   
  35. </html>  
<%@ 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/>的自动追加参数特性。代码为:

 

 

Java代码
  1. #禁止所有<struts:url/>标签的自动追加参数特性   
  2. struts.url.includeParams=none  
#禁止所有<struts:url/>标签的自动追加参数特性
struts.url.includeParams=none

 

 添加成功页面很简单,只输出一句成功信息,这里省略了。书籍列表页面使用<s:iterator/>遍历Action的bookList,显示书名、作者。出版日期等。代码如下:

 

 

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>   
  1. <%@ taglib uri="/struts-tags" prefix="s" %>   
  2. <%   
  3. String path = request.getContextPath();   
  4. String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";   
  5. %>   
  6.   
  7. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">   
  8. <html>   
  9.   <head>   
  10.     <base href="<%=basePath%>">   
  11.        
  12.     <title><s:property value="title" escape="false"/></title>   
  13.        
  14.     <meta http-equiv="pragma" content="no-cache">   
  15.     <meta http-equiv="cache-control" content="no-cache">   
  16.     <meta http-equiv="expires" content="0">       
  17.     <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">   
  18.     <meta http-equiv="description" content="This is my page">   
  19.     <!--   
  20.     <link rel="stylesheet" type="text/css" href="styles.css">   
  21.     -->   
  22.   
  23.   </head>   
  24.      
  25.   <body>   
  26.      <a href="<s:url action="initAddBook"/>">添加数据</a><!-- URL标签引用 -->   
  27.      <a href="<s:url action="listBook"/>">书籍列表</a><!-- 自动添加“.action” -->   
  28.      <a href="<s:url action="clearBook"/>">清空书籍列表</a>   
  29.       <table>   
  30.          <tr>   
  31.             <th>书名</th>   
  32.             <th>作者</th>   
  33.             <th>出版日期</th>   
  34.         </tr>   
  35.         <s:iterator id="book" value="bookList">   
  36.             <tr>   
  37.                 <td>${book.name }</td>   
  38.                 <td>${book.author }</td>   
  39.                 <td>${book.publishedDate }</td>   
  40.             </tr>   
  41.         </s:iterator>   
  42.       </table>   
  43.       <s:property value="title" escape="false"/>   
  44.   </body>   
  45. </html>  

你可能感兴趣的:(POJO,action)