17_Struts 2.x 高级应用

来源:互联网 发布:jsp数据展示样式 编辑:程序博客网 时间:2024/06/05 03:06

17.1 数据类型转换器

17.1.1 实例:日期转换器

DateTimeConvertor.java

package com.uikoo9.util;import java.text.DateFormat;import java.text.SimpleDateFormat;import java.util.Map;import ognl.DefaultTypeConverter;public class DateTimeConvertor extends DefaultTypeConverter {private DateFormat[] dateFormat = {new SimpleDateFormat("yyyy-mm-dd"),new SimpleDateFormat("yyyy/mm/dd"),new SimpleDateFormat("yy-mm-dd"),};private DateFormat[] timeFormat = {new SimpleDateFormat("hh:mm:ssss"),new SimpleDateFormat("hh:mm"),};@SuppressWarnings("rawtypes")@Overridepublic Object convertValue(Map context, Object value, Class toType) {String[] parameterValues = (String[])value;try {if(toType.equals(java.sql.Date.class)){for(DateFormat format: dateFormat){return new java.sql.Date(format.parse(parameterValues[0]).getTime());}}else if(toType.equals(java.sql.Time.class)){for(DateFormat format : timeFormat){return new java.sql.Time(format.parse(parameterValues[0]).getTime());}}else if(toType.equals(java.util.Date.class)){for(DateFormat format: dateFormat){return format.parse(parameterValues[0]);}}else if(toType.equals(String.class)){if(value instanceof java.sql.Date){}else if(value instanceof java.sql.Time){}else if(value instanceof java.util.Date){return dateFormat[0].format((java.util.Date) value);}}} catch (Exception e) {e.printStackTrace();}return super.convertValue(context, value, toType);}}

17.1.2 配置转换器

需要配置xwork-conversion.properties,如

java.sql.Date = com.uikoo9.util.DateTimeConvertorjava.sql.Time = com.uikoo9.util.DateTimeConvertorjava.util.Date = com.uikoo9.util.DateTimeConvertor

17.1.3 Action代码示例

ConvertorAction.java

package com.uikoo9.action;import java.sql.Date;import java.sql.Time;import com.opensymphony.xwork2.Action;public class ConvertorAction implements Action {private Date sqlDate;private Time sqlTime;private java.util.Date utilDate;public String execute() throws Exception {return INPUT;}public String convert(){return SUCCESS;}//getters and setterspublic Date getSqlDate() {return sqlDate;}public void setSqlDate(Date sqlDate) {this.sqlDate = sqlDate;}public Time getSqlTime() {return sqlTime;}public void setSqlTime(Time sqlTime) {this.sqlTime = sqlTime;}public java.util.Date getUtilDate() {return utilDate;}public void setUtilDate(java.util.Date utilDate) {this.utilDate = utilDate;}}

struts.xml

        <action name="convertor" class="com.uikoo9.action.ConvertorAction">        <result name="input">/convertor.jsp</result>        <result name="success">/convertorSuccess.jsp</result>        </action>

convert.jsp

<%@ page language="java" import="java.util.*"%><%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%><%@ taglib uri="/struts-tags" prefix="s"%><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html><head><title>convert</title></head><body><s:form action="convertor"><s:label label="转换器"></s:label><s:textfield name="sqlDate" label="SQL Date"></s:textfield><s:textfield name="sqlTime" label="SQL Time"></s:textfield><s:textfield name="utilDate" label="Util Date"></s:textfield><s:submit value="提交" method="convert"></s:submit></s:form></body></html>

convertSuccess.jsp

<%@ page language="java" import="java.util.*"%><%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%><%@ taglib uri="/struts-tags" prefix="s"%><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html><head><title>success</title></head><body>java.sql.Date: <s:property value="sqlDate"/>java.sql.Time: <s:property value="sqlTime"/>java.util.Date: <s:property value="utilDate"/><br/><a href="convertor.action">重新转换</a></body></html>

17.1.4 为Action配置转换器

可以单独的为Action配置转换器

struts.xml

        <action name="convertor"         class="com.uikoo9.action.ConvertorAction"        converter="com.uikoo9.util.DateTimeConvertor">        <result name="input">/convertor.jsp</result>        <result name="success">/convertorSuccess.jsp</result>        </action>


17.2 获取request,response

17.2.1 利用ServletActionContext的静态方法

这种方式也叫做非注射方式(非Ioc方式)

LoginAction.java

package com.uikoo9.action;import java.io.File;import javax.servlet.ServletContext;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import javax.servlet.http.HttpSession;import org.apache.struts2.ServletActionContext;import com.opensymphony.xwork2.ActionSupport;@SuppressWarnings("serial")public class LoginAction extends ActionSupport{private String account;private String password;@SuppressWarnings("unused")public String login() throws Exception{HttpServletRequest request = ServletActionContext.getRequest();HttpServletResponse response = ServletActionContext.getResponse();HttpSession session = request.getSession(true);ServletContext context = ServletActionContext.getServletContext();session.setAttribute("account", account);File uploadFile = new File(context.getRealPath("upload"));return execute();}//getters ande setterspublic String getAccount() {return account;}public void setAccount(String account) {this.account = account;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}}

17.2.2 利用相关的Aware接口

实现了Aware接口的Action,在实例化的时候会将需要的资源注射进去

ServletAwareAction.java

package com.uikoo9.action;import java.util.Map;import javax.servlet.ServletContext;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import org.apache.struts2.interceptor.ServletRequestAware;import org.apache.struts2.interceptor.ServletResponseAware;import org.apache.struts2.interceptor.SessionAware;import org.apache.struts2.util.ServletContextAware;import com.opensymphony.xwork2.ActionSupport;@SuppressWarnings("serial")public class ServletAwareAction extends ActionSupport implements ServletRequestAware, ServletResponseAware, SessionAware, ServletContextAware {private ServletContext application;private HttpServletRequest request;private HttpServletResponse response;@SuppressWarnings("rawtypes")private Map session;@Overridepublic void setServletContext(ServletContext application) {this.application = application;}@Overridepublic void setSession(Map<String, Object> sessionValues) {this.session = sessionValues;}@Overridepublic void setServletResponse(HttpServletResponse response) {this.response = response;}@Overridepublic void setServletRequest(HttpServletRequest request) {this.request = request;}@SuppressWarnings("unused")@Overridepublic String execute() throws Exception {String upload = application.getRealPath("upload");request.getRemoteAddr();response.getContentType();session.get("account");return SUCCESS;}}


17.3 使用Validator校验数据

17.3.1 使用XML配置数据校验Validator

使用XML配置时,需要在Action所在的包中添加BookAction-addBook-Validation.xml,而且支持校验的Action必须实现Validateable接口

BookAction-addBook-validation.xml

<!DOCTYPE validators PUBLIC        "-//Apache Struts//XWork Validator 1.0.2//EN"        "http://struts.apache.org/dtds/xwork-validator-1.0.2.dtd"><validators>    <field name="book.name">        <field-validator type="requiredstring"><param name="trim">true</param><message>请输入书籍名称</message>        </field-validator>    </field>    <field name="book.author">        <field-validator type="requiredstring"><message>请输入书籍作者</message>        </field-validator>    </field>    <field name="book.publishedDate">        <field-validator type="date">        <param name="min">1900-01-01</param>        <param name="max">2020-01-01</param><message><![CDATA[日期格式必须位于1990-01-01与2020-01-01之间]]></message>        </field-validator>    </field></validators>

17.3.2 配置客户端Validator

在<s:form>中添加属性validate="true"即可支持客户端js的校验,显示效果相同

17.3.3 常用的Validator

required:是否为null

requiredstring:字符串是否为null

stringlength:字符串长度

int/double:是否为int/double,而且可以检测长度等

date

email

url

conversion

expression/fieldexpression

visitor

regex

17.3.4 使用@Java注解配置Validator

BookAction.java

package com.uikoo9.action;import java.util.ArrayList;import java.util.List;import com.opensymphony.xwork2.ActionSupport;import com.opensymphony.xwork2.validator.annotations.DateRangeFieldValidator;import com.opensymphony.xwork2.validator.annotations.RequiredStringValidator;import com.opensymphony.xwork2.validator.annotations.Validations;import com.opensymphony.xwork2.validator.annotations.ValidatorType;import com.uikoo9.model.Book;@SuppressWarnings("serial")public class BookAction extends ActionSupport{public static List<Book> bookList = new ArrayList<Book>();private String title;private Book book;public String initAdd(){return "initAdd";}@Validations(requiredStrings = {@RequiredStringValidator(type = ValidatorType.SIMPLE,trim = true,fieldName = "book.name",message = "请输入书籍名称. *"),@RequiredStringValidator(type = ValidatorType.SIMPLE,trim = true,fieldName = "book.author",message = "请输入书籍作者. *")},dateRangeFields = {@DateRangeFieldValidator(type = ValidatorType.SIMPLE,fieldName = "book.publishedDate",min = "1900-01-01",max = "2020-01-01",message = "日期必须大于${min}小于${max},当前值为${book.publishedDate}.")})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";}//getters and setterspublic 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 static List<Book> getBookList() {return bookList;}}

17.4 本章小结


原创粉丝点击