Struts2框架技术
Struts框架提供了一种基于MVC体系结构的Web程序开发方案,具有组件模块化、灵活性和重要性等优点。
Struts2框架简介
Struts是整合了当前主流网站技术中的Servlet、JSP、JavaBean、JDBC、XML等相关开发技术基础之上的一种主流Web开发框架。
Struts2的组成与工作原理
Struts2框架按照MVC的思想主要有控制层,包括核心控制器FilterDispatcher、业务控制器Action;模型层,包括业务逻辑组件和数据库访问组件;视图组件。
- 模型组件
模型组件是业务逻辑的模块,有JavaBean或者EJB构成
- 视图组件
视图组件主要有HTML、JSP和Struts2标签,以及FreeMarker、Velocity等模块视图技术
- 控制器组件
控制器组件主要有一个StrutsPrepareAndExecuteFilter核心控制器:拦截< url-pattern>/*< /url-pattern>指定的所有用户请求。 业务控制器Action组成:普通的Java类、不需要实现任何接口或继承任何类。
Created with Rapha?l 2.2.0
浏览器发出请求
Struts2内置的拦截器或用户自定义拦截器
StrutsPrepareAndExecuteFilter拦截请求
Actionl类实现业务操作
响应浏览器
搭建Struts2框架
搭建Struts2框架,需要两个步骤:1、下载Struts2框架,找到开发Struts2应用所需要的Jar文件,导入工程。2、修改Web.xml文件,加入Struts2MVC框架启动配置。 Struts必须与JDK1.4以上版本和Servlet Container(Tomcat)结合使用。
Struts框架文件目录介绍
文件夹下包含了Struts2的示例应用
文件夹下包含了Struts2的相关文档,Struts2快速入门、Struts2的文档
文件夹下包含了Struts2框架的核心类库,以及Struts2的第三方插件类库
文件下包含了Struts2框架的全部源代码
下载配置Struts2框架
下载地址:http://struts.apache.org/download
-
下载Struts框架  -
解压struts-2.3.37-all.zip文件  -
开发Struts2应用所依赖的Jar文件
- struts2-core-2.x.x.jar:Struts2框架的核心类库
- xwork-core-2.x.x.jar:XWork类库
- ognl-x.x.x.jar:对象图导航语言,struts2框架通过其读写对象的属性
- freemarker-2.x.x.jar:Struts2的UI标签的模板使用FreeMarker编写
- commons-logging-x.x.x.jar:日志记录
- commons-fileupload-x.x.x.jar:文件上传组件
- javassist-x.x.x.GA.jar:对象图导航语言类库
- commons-validator-x.x.x.jar:验证类库
-
导入Jar包  -
Web.xml文件中配置Struts2启动信息  -
配置项目下Src文件中的struts.xml文件
暂且不需要,下文需要再详细说明
Struts2入门案例——基于Struts2任意两个数据的代数和
input.jsp用于输入两个数,InputAction.java 用于处理接受的数加以运算,结果为非负数:positive.jsp,否则:negative.jsp
输入数字页面:input.jsp  
业务处理页面:InputAction.java 
输出结果页面:positive.jsp negatiive.jsp  
Struts2的中文乱码
中文乱码问题一般指的是当请求参数中有中文时,无法在Action中得到正确的中文。Struts2中有两种方法可以解决这个问题。
- 设置JSP页面的pageEncoding=“UTF-8”。
- 如果JSP页面的pageEncoding=“GBK”,那么需要在源包(Src)下,建立一个属性文件struts.properites,并在文件内填写如下内容。
struts.locale=zh_CN struts.i18n.encoding=gbk
Struts框架配置文件

- Bean配置
如上配置格式
- 常量配置
如上配置格式 主要用于指定struts中的常量取值
- 包含配置
如上配置格式 < include/>元素能把其他开发的配置文件包含过来,但是被包含的每个配置文件必须和struts.xml格式一样。
- 包配置
Struts2框架中使用包来管理Action,主要用于管理一组业务功能相关的action。实际应用中,应该把一组业务功能相关的Action放在同一个包中。
配置包时必须指定的属性,必须唯一。指定了包名,其他包要继承该包,必须通过该属性进行引用。
用于定义该包的命名空间,作为访问Action的一部分
通常每个包都要继承struts-default包,因为Struts很多核心的功能都是拦截器实现的。struts-default定义了这些拦截器。当包继承了struts-default才能使用struts2的核心功能。 struts-default包是在struts2-core-2.x.x.jar文件中的struts-default.xml中定义的,struts-default.xml也是Struts2默认配置文件,且自动加载
- Action配置
Action的配置能够让Struts2知道Action的存在。Struts2使用包来组织和管理Action。
指定客户端发送请求的地址映射名称。
指定Action的实现类的完整名
指定Action类中的处理方法名,默认为Action中的execute()方法
指定Action类型转换器的完整类名
- result配置
作为< action>的子元素用于配置action跳转的目的地。
用于判断action类的处理方法返回值,若等于,则跳转指定页面。
指定结果类型定向到什么类型的文件,可以是JSP文件或者Action类。
- result类型——type属性及其属性值
type可以有多种选择,默认的JSP页面的转发。若要指定其他类型的页面,需要配置如下属性。
默认类型,表示转发到JSP页面。和< jsp:forward/>效果一致。
<result name = “success" type="dispatcher">
//<param name="location">属性指定了转发的页面
//<param name="parse">属性指定了转发的页面是否允许使用OGNL表达式。
<param name="location">/message.jsp</param>
<param name="parse">true></param>
</result>
重定向,配置方法类似上述
表示转发到Action
<result name="resultName" type="chain">
<param name="namespace">表示Action所造的命名空间</param>
<param name="actionName">表示Action名</param>
</result>
重定向Action,方法类似上述。
如何访问Action
访问Action有两个关键点:1、包的命名空间。2、Action的名称。
例如:
<package name="default" namespace="/" extends="struts-default">
<action name="xyz" class="beans.xyz" method="execute">
<result name="success" type="dispatcher">
<param name="location">/abc.jsp</param>
<param name="parse">true</param>
</result>
</action>
</package>
上述指定了包在/路径下,action请求地址为xyz。 所以当表单的action="xyz"时,可请求指定的xyzAction类。 method指定了xyz类默认执行的方法。返回值为success,则会跳转到abc.jsp页面。
Struts框架业务控制器——Action类
基于Struts2的Web应用程序,action是程序的核心。并在struts.xml文件中配置Action。
实现Action类
Struts2对Action类没有特殊要求,可以是任意的Java类。Action类的实现方式有以下三种
- 普通的Java类
- 继承ActionSupport实现Action
- 对象属性驱动的Action
普通的Java类作为Action
可以创建任意一个Java类,但通常包含一个execute()普通方法,该方法没有任何参数,并返回字符串类型。用于< result>标签的判断。
继承ActionSupport实现Action
Struts2类库中的Action接口(Action.java)
public interface Action{
public static final String SUCCESS="success";
public static final String NONE="none";
public static final String ERROR="error";
public static final String INPUT="input";
public static final String LOGIN="login";
public String execute() throws Exception;
}
Struts2为Action接口提供了一个实现类ActionSupport。ActionSupport类是一个默认的Action实现类,有如下三个主要方法:
- void addFieldError(String fieldname,String errorMessafe):添加错误信息
- String execute():请求时,执行的方法需要重载???
- void validate():用于输入验证
实际开发中继承ActionSupport类,且重写execute()方法
对象属性驱动的Action
Struts2中的Action能自动将请求参数传递给对应的包含Setter方法的属性,但当页面请求参数较多时,把过多的参数属性定义在Action中不符合Struts所倡导的松耦合原则,较好的方法是使用JavaBean封装参数。
设计一个JavaBean类:Add.java 
修改业务控制器,继承ActionSupport类: 
修改input.jsp页面 
Action访问Web对象
Struts2中,Action类和Web对象之间没有直接关系,但可以通过Action访问Web对象有四种方式
- 直接访问Web对象——Servlet依赖容器方式
- 通过ActionContext——Map依赖容器方式
- 通过IoC访问Servlet——Map Ioc方式
- 通过Ioc访问Servlet——Servlet IoC方式
直接访问Web对象——Servlet依赖容器方式
Struts2框架提供了org.apache.struts2.ServletActionContext辅助类来获得Web对象
例如获取request对象:
HttpServletRequest request = ServletActionContext.getRequest();
修改InputAction.java,将x、y、sum分别存放在request、session、aplication中
InputAction.java:  
修改positive.jsp 
通过ActionContext访问——Map依赖容器方式
ActionContext类位于com.opensymphony.xwork2中,提供一系列相关方法用于访问保存在ServletContex、HttpSession、HttpSevletRequest中的信息,并将访问结果存放在Map中。ActionContext类中的常用方法如下:
- public static ActionContext getContext():获得ActionContext对象
- public Object get(Object key):在ActionContext中查找key的值
- public void put(Object key,Object value):向当前ActionContext存入值
- public void setApplication(Map application):设置application的值
- public void setSession(Map Session):设置session的值
- public Map getParameter():从请求对象中获取参数
- public Map getApplication():获取ServletContext中保存的Attribute
- pulbic Map getSession():获取HttpSession中保存的Attribute
- 注意 没有获取request对象的方法,所以需要在get(“request”)方法中找到request,如下所示。
public class Action2{
private Map<String,Object> request;
private Map<String,Object> session;
private Map<String,Object> application;
private int x,y,sum;
public Action2(){
ActionContext context = ActionContext.getContext();
request = (Map<String,Object>)context.get("request");
session = context.getSession();
application = context.getApplication();
}
、、、、、、、、、
、、、、、、、、、
public String execute(){
sum = x+y;
request.put("x2",x);
session.put("y2",y);
application.put("sum2",sum);
if(sum>=0)
return "+";
else
return "-";
}
}
通过IoC访问Servlet对象——Map IoC方式
Struts2框架中,通过IoC方式将Servlet对象注入到Action中,需要在Action中实现以下接口:
- org.apache.struts2.interceptor.RequestAware
该接口有void setRequest(Map map)方法,实现该方法的Action可访问HttpServletRequest对象
- org.apache.struts2.interceptor.SessionAware
该接口有void setSession(Map map)方法,实现该方法的Action可访问HttpSession对象
- org.apache.struts2.interceptor.ApplicationAware
该接口有void setApplication(Map map)方法,实现该方法的Action可访问ServletContext对象
例如:
业务控制器:InputAction3.java 实现ApplictionAware、SessionAware、RequestAware  重写接口的方法:  将属性压入Map: 
通过IoC访问Servlet对象——Servlet IoC方式
IoC方式将Servlet对象注入到Action,需要在Action中实现以下三个接口:
- org.apache.struts2.interceptor.ServletContextAware
void setServletContext(ServletContext servletContext)方法,实现该接口的Action可以通过该方法获取ServletContext对象。
- org.apache.struts2.interceptor.ServletRequestAware
void setServletRequest(HttpServletRequest request)方法,实现该接口的Action可以通过该方法获取HttpServletRequest对象。
- org.apache.struts2.interceptor.ServletResponseAware
void setServletResponse(HttpServletResponse response)方法,实现该接口的Action可以通过该方法获取HttpServletSession对象。
例如:
业务控制器:InputAction4.java 这里实现一个接口,ServletRequestAware  利用HttpServletRequest对象,获取HttpSession和ServletContext对象: 
多方法的Action
上述所定义的Action都是通过execute()方法自动完成处理请求的。虽然实现方便,但是Action数量巨多,struts.xml也要为每一个Action配置以下,非常臃肿。但在实际上可以用一个Action处理多个业务请求,并在struts.xml指定业务处理所采用的方法。
为Action配置多个method属性
可以在前端修改表单的提交请求,然后修改struts.xml配置文件中的action标签,每一个对应一个方法。
例如:
业务控制器:MethodsAction.java  配置文件struts.xml: 
前端页面input5.jsp:   显示结果页面:show.jsp: 
动态方法调用
动态方法调用直接在表单action属性指定需要调用的方法,如下格式: < form action=“Action名字!方法名”>
例如:
修改上述input5.jsp页面如下: 
修改struts.xml文件如下:  注意:需要在struts.xml添加两句话,启动动态方法调用 
使用通配符映射方式
在struts.xml文件中配置action元素时,它的name、class、method属性都支持通配符。当使用通配符定义action的name属性时,相当于一个元素定义了多个逻辑Action
修改input5.jsp如下: 
修改struts2.xml如下: 
Struts2的OGNL表达式、标签库、国际化
Struts视图除了可以使用JSP、HTML、JavaScript和样式表等技术外,Struts2框架专门给出了自己的标签库、OGNL表达式和国际化处理方式。
Struts2的OGNL表达式
OGNL(对象图导航语言),可以通过简单的表达式访问Java对象中的属性。Struts2的默认表达式语言
Struts2的OGNL对象、属性及其访问
Struts2框架中的ActionContext是OGNL的根对象,即Action对象是OGNL的根对象。假设Action中有一个属性类型是Student(name,age),变量名为stu,那么访问属性name的OGNL表达式为:stu.name。
访问其他Context中的对象时,由于不是根对象,在访问时需要加"#"前缀。
- application:用于访问ServletContext属性
#application - session:用于访问HttpSession属性
#session - request:用于访问HttpServletRequest属性
#request - parameters:用于访问Http请求参数
#parameters
Struts2的OGNL集合及其访问
OGNL集合可以实现List对象或者Map对象
- OGNL中使用List对象的格式
p{e1,e2,e3,…}:生成一List对象包含,e1,e2,e2,…等元素 - OGNL中使用Map对象的格式
#{key1:value1,key2:value2,key3:value3,…}:生成一个Map对象。
Struts的标签库
待补充
Struts的国际表达式
待补充
Struts拦截器
拦截器(Intercepter)是Struts2的核心组成部分。拦截器可以动态拦截Action调用的对象。 拦截器分为两类:Struts2提供的内建拦截器和用户自定义的拦截器。 Struts2拦截器就是Servlet中的过滤器
Struts2内建拦截器
Struts2用户自定义拦截器
为了实现自定义拦截器,Struts2提供了Interceptor接口。以及对该接口的一个抽象拦截器类AbstractInterceptor。Struts2还提供了一个MethodFilterInterceptor类,是AbstracteInterceptor类的子类,若要实现方法过滤,就需要继承MethodFilterInterceptor类。
如何实现用户自定义拦截器
实现用户自定义拦截器需要以下三个步骤:
- 创建一个实现Interceptor接口的类(或者继承AbstractInterceptor或继承MethodFilterInterceptor类)
- 在struts.xml中注册上一步中定义的拦截器。
- 在需要使用的Action中引用上述定义的拦截器
Interceptor拦截器接口
import com.opensymphony.xwork2.ActionInvocation;
import java.io.Serializable;
public interface Interceptor extends Serializable{
void destroy();
void init();
String intercept(ActionInvocation invocation)thorws Exception;
}
- void destroy():用于在拦截器执行完之后,自动调用的。一般用于释放init()方法中打开的资源。
- void init():拦截器执行之前调用,用于初始化系统资源。
- String intercept(ActionInvocation invocation):实现具体的拦截操作,返回一个字符串作为逻辑视图。ActionInvocation对象的invoke()方法可以检查,是否还有拦截器,若有则继续调用余下的拦截器,若没有,执行Action
AbstractInterceptor抽象拦截器类
如上,AbstractInterceptor抽象拦截器类实现了Interceptor接口,方法一样
自定义拦截器
如上,自定义的拦截器类实现Interceptor接口或者继承AbstractInterceptor,方法一样
在Struts.xml中配置拦截器
自定义方法拦截器
案例——文字过滤器的设计
对一些发表不文明的语句,通过拦截器将不文明的文字进行自动替代。
评论页面:news.jsp:  显示评论页面:success.jsp 
拦截器:MyInterceptor.java  Action:PublicAction.java 
struts.xml 
Struts2的文件上传和下载
在Struts2框架中,专门提供了文件上传、下载功能的两个包:commons-fileupload-x.x.x.jar和commons-io-x.x.x.jar。
Struts2的文件上传
使用Struts2上传文件时,只需使用普通Action类,但为了获取一些上传文件的信息,如上传文件名、文件类型,需要按照一定的规则在Action中增加一些getter和setter方法。实现文件的上传分为以下5个步骤:
- 编写上传页面,并设置表单的编码类型
- 编写上传页面业务处理类Action,定义三个变量,文件、文件名、文件类型
- 修改配置文件struts.xml,对Action进行配置
- 文件上传过滤
- 编写上传成功页面
上传页面:upload.jsp 
Action处理页面:FileUpload.java   struts.xml

上传成功页面:uploadSuccess.jsp   上传失败页面:error.jsp 
Struts2的文件下载
Struts2的文件下载会使用到commons-io-x.x.x.jar包。注意:若下载的文件名为中文名,需要编码转换;下载之前进行进一步检查,判断用户有没有足够的权限下载该文件,此功能暂不实现。利用Struts2下载文件,需要以下三个步骤:
- 编写下载页面
- 编写Struts2实现文件下载 的Action
- 修改struts.xml。
下载页面: 
Action:DownloadAction.java 
编写struts.xml 
Struts2的输入验证
Struts2提供了安全的服务器验证方法,一种是使用validate()方法,另一种是配置验证(使用配置验证文件)。
使用validate()方法实现验证
在Struts2框架中,validate()方法是专门用来验证数据的,实现该方法,需要继承ActionSupport类然后,重写validate()方法。
使用验证文件实现验证
Struts2框架还提供了一种基于验证文件的输入验证方式,将验证规则保存在特定的验证文件中。
验证文件的命名规则
Acion类名-validation.xml,放在和Action类同一个文件夹下
校验器怎么写
校验器分为字段校验器和非字段校验器
字段校验器
校验文件类型以< field>元素为基本元素,这个基本元素的name属性指定被校验的字段
<validators>
<field name="被校验的字段">
<field-validator type="校验器的类型">
<param name="参数名">参数值</param>
<message>信息</message>
</field-validator>
</field>
........
</validators>
非字段校验器
直接指定校验器的类型
<validators>
<validator type="指定类型">
<param name="fildName">需要被检验的字段</param>
<param name="参数">参数指</param>
<message>信息</message>
</validator>
</validators>
案例——实现客户注册输入验证
用validate()方法对注册页面的信息输入验证。实现步骤如下:
- 创建注册用户的JavaBean类
- 创建读写数据库类(此处不实现)
- 创建业务控制器,完成对输入信息的验证
- 编写注册页面
- 编写结果显示页面
创建注册用户的JavaBean类 
业务控制器:RegisterAction.java  
注册页面:register.jsp    
struts.xml 
@syl 2021/07/11 0:01 黑 抽烟
|