Struts2学习
来源:互联网 发布:19级研究所升级数据 编辑:程序博客网 时间:2024/05/01 01:23
说明:
本文为刘京华老师的《JavaWeb王者归来》的学习笔记
一、Struts2简介
Struts2和Struts一样是个MVC框架,但Struts2和Struts没有关系,是从WebWork框架演变过来的
二、Struts2实例
1、登录功能Action
package com.xie.action;import com.opensymphony.xwork2.ActionSupport;public class LoginAction extends ActionSupport { private String account; private String password; @Override public String execute() throws Exception { // TODO Auto-generated method stub if(account.equalsIgnoreCase("xie")&&password.equalsIgnoreCase("xie")){ return SUCCESS; } return LOGIN; } public 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; }}
LoginAction中的属性account和password代表JSP的两个输入框。Struts2会自动把输入框中的内容通过getter、setter方法设置进来。execute是Struts2的主方法。
2、Struts2的配置文件struts.xml
<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd"><struts> <package name="main" extends="struts-default" namespace="/"> <action name="login" class="com.xie.action.LoginAction"> <result name="success">welcome.jsp</result> </action> </package></struts>
Struts2的配置文件中引入了package的概念,所有的result、action都必须配置到package中。package具有继承的特性,子package里的Action能使用父package里的资源。自定义的package一般继承struts-default。这里面包含了Struts2的默认拦截器。
3、登录页面和欢迎页
(1)、login.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" %><%@ taglib uri="/struts-tags" prefix="s"%><s:form action="login"> <s:textarea name="account" label="账号"/> <s:textarea name="password" label="密码"/> <s:submit label="登录"/></s:form>
(3)、success.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" %><%@ taglib uri="/struts-tags" prefix="s"%>登录成功,欢迎你<s:property value="account"/>
4、web.xml
<?xml version="1.0" encoding="UTF-8"?><web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> <display-name></display-name> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> <filter> <filter-name>struts2</filter-name> <filter-class> org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter </filter-class> </filter> <filter-mapping> <filter-name>struts2</filter-name> <url-pattern>*</url-pattern> </filter-mapping></web-app>
Strut2中采用StrutsPrepareAndExecuteFilter拦截作为分发器。
三、Struts2的工作流程
1、Struts2的工作流程
- 访问jsp页面
- 提交表单后数据提交给login.action
- Struts2截获所有请求,包括.action请求
- 查找struts2.xml中login.action对应的LoginAction
- 生成一个LoginAction实例,将数据提交到该示例中
- 调用LoginAction的execute方法
- 跳转到JSP的执行结果,丢掉LoginAction实例。
2、Struts2的线程安全
Struts中的所有Action都只有一个实例,该Action实例会被反复调用。而Struts2中的每个Action都会有多个实例,处理一次请求生成一个实例,这些实例彼此独立,处理完毕之后即销毁。因此Struts1的Action是线程不安全的,而Struts2中的Action是线程安全的。
四、Struts2的高级应用
1、数据类型转换器
有时候Struts2的转换器不能满足类型转换的所有需求这时就需要了类型转换器
2、类型转换器实例
(1)、DateTimeConverter.java
public class DateTimeConverter() extends DefaultTypeConverter{ public Object convertValue(Map context,Object value,Class toType){ if(---){ return xxx; }else{ return xxx; } return super.convertValue(context,value,toType); }}
数据类型转换需要实现ongl.TypeConverter接口,一般直接继承DefaultTypeConverter类,并实现convertValue方法。
convertValue(Map context,Object value,Class toType)中的value和toType分别代表:待转换的值和要转换的类型。
(2)、配置转换器(xwork-conversion.properties)
#类型=对应的转换器类java.sql.Date=com.xie.DateTimeConvertor
如配置此文件则该文件对所有Action的java.sql.Date类型都有效。
(3)、只为某个Action配置转换器
①、为该Action配置转换器TestBean-conversion.properties
#类型=对应的转换器类java.sql.Date=com.xie.DateTimeConvertor
②、struts.xml
<action name="convertor" class="com.xie.action.ConvertorAction" convertor="com.xie.convertor.DateTime"> <result name="scuess">/welcome.jsp</result></action>
四、获取request、response对象
Struts2的Action完全抛弃了request、response等ServletAPI,使业务层更加独立。但是有时候需要使用request、response等。下面提供两种获取request、response的途径。
1、ServletActionContext的静态方法
Struts2利用ServletActionContext类来维护Servlet对象,把Servlet对象放到ServletActionContext中,例如request、response、session、application等。ServletActionServlet采用ThreadLocal来维护不同线程的Servlet对象。这种方式也叫作非注射方式(非IOC方式)。
HttpServletRequest request = ServletActionContext.getRequest();HttpServletResponse response= ServletActionResponse.getResponse();HttpServletSession session= session.getSession();ServletContext context = request .getServletContext ();
2、利用Aware相关接口
Struts2提供了Aware接口,实现了Aware的接口的Action能够感知相应的资源。如果Struts2实例化一个Action实例时,会把相应的资源通过Aware接口方法注射进去。这种方式也叫作注射方式(IOC方式)。
Servlet API中常用的对象request、response、session、application对应的Aware接口分别为:ServletRequestAware、ServletResponseAware、SessionAware、ServletContextAware。
private ServletContext application; private HttpServletRequest request; private HttpServletResponse response; private Map session; public void setServletRequest(HttpServletRequest request) { this.request = request; } public void setServletResponse(HttpServletResponse response) { this.response = response; } public void setSession(Map sessionValues) { this.session = sessionValues; }
实现了ServletAwareRequest接口就会有一个setServletRequest()方法获取request对象。。。
Aware接口其实就是一种拦截器,拦截器代码会执行在Action之前执行,将相关的Servlet对象设置进来。
五、Struts2拦截器和文件上传
1、使用拦截器
Struts2中提供了AOP机制,拦截器采用AOP的思想。它提供了一种机制开发者能把相对独立的代码抽象出来,配置到Action的前后执行。Struts2中称拦截器链为拦截器站。拦截器栈是按顺序配置的多个拦截器,在Action前后依次被调用。
(1)、timer计时拦截器
<action name="timer" class="com.helloweenvsfei.struts2.action.TimerAction"> <interceptor-ref name="timer"></interceptor-ref> <result>/timerSuccess.jsp</result></action>
package需要继承struts-default才能使用Struts2里的拦截器,因为timer计时拦截器是配置在Struts-default包中的。该拦截器在用于粗略估计系统性能时很好用。
(2)、token防重复提交拦截器
<action name="token" class="com.helloweenvsfei.struts2.action.TokenAction"> <interceptor-ref name="token"></interceptor-ref> <interceptor-ref name="basicStack" /> <result>/tokenSuccess.jsp</result> <result name="input">/tokenInput.jsp</result> <result name="invalid.token">/tokenInvalid.jsp</result></action>
token拦截器用于保证表单只被提交一次,如果再次提交该表单,拦截器会拦截该请求。它的原理是:显示表单的时候,在Session中对该表单做一个标记,该标记只能使用一次,使用过后就失效了,从而保证表单最多只提交一次数据。重复提交数据因为标记已失效而提交失败。
3、execAndWait执行等待拦截器
<action name="wait" class="com.helloweenvsfei.struts2.action.WaitAction"> <interceptor-ref name="completeStack" /> <interceptor-ref name="execAndWait" /> <result>/waitSuccess.jsp</result> <result name="wait">/waiting.jsp</result></action>
execAndWait拦截器接受请求之后,能判断上一个请求是否处理完毕,如果处理完毕则显示结果页面。否则显示等待页面。
- [Struts2]Struts2学习总结
- Struts2 学习
- Struts2学习
- 学习struts2
- 学习struts2
- 学习struts2
- 学习Struts2
- Struts2学习
- struts2学习
- 学习struts2
- struts2学习
- struts2学习
- struts2学习
- struts2学习
- struts2学习
- Struts2学习
- struts2学习
- struts2学习
- C#之数据序列化
- 【福利贴】教你如何移动联通电信免流
- Dom4j解析xml使用方法
- 光标问题
- 电脑装系统之UltraIso(软碟通)
- Struts2学习
- 项目启动时,提示spring配置文件未知的utf-8编码
- Pyhon中set,get,方法深入了解
- EL表达式取Map,List值的总结
- 利用手机gps获取经纬信息定位
- leetcode_118 Pascal Triangle
- UI控件--ListView补充:包含多个子项布局的列表
- 【日常吐槽 · 第二期】向cocos的更新速度致敬
- 套接字相关