一、Struts2简介
Struts2是轻量级的MVC框架,主要解决了请求分发的问题,重心在控制层和表现层。低侵入性,与业务代码的耦合度很低。Struts2实现了MVC,并提供了一系列API,采用模式化方式简化业务开发过程。
二、struts2内部运行流程
(1)客户端发出HTTP请求
(2)然后请求被核心过滤器StrutsPrepareAndExecuteFilter拦截
(3)核心过滤器将请求转发到Action映射器,Action映射器负责识别当前的请求是否需要交由Struts2处理。
(4)Action映射器返回需要struts2处理的信息,StrutsPrepareAndExecuteFilter会创建一个Action代理
(5)Action代理并不知道执行哪一个Action,它会向配置管理器询问调用哪一个Action,配置管理器会从struts.xml读取我们配置的Action信息。
(6)Action代理创建相关请求的Action对象,调用相关的方法之前,struts2的一系列拦截器会帮我们做一些操作,例如获取请求参数等。
(7)然后调用execute方法根据返回的字符串去匹配相应的页面,
(8)页面可以获取一些页面模板,然后生成最终页面,再倒序的执行拦截器的后续操作
(9)最后生成HTTP响应内容
三、搭建Struts2运行环境
①新建Web项目,导入Struts2需要使用的jar包。
②在web.xml中配置Struts2的核心Filter,配置struts2的核心拦截器。
<?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">
<!-- 配置Struts2的核心过滤器 -->
<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>
<dispatcher>REQUEST</dispatcher>
<dispatcher>FORWARD</dispatcher>
</filter-mapping>
</web-app>
③创建struts.xml(格式可以参考核心包根路径下的DTD文件,struts-default.xml),配置Struts.xml。
<!-- 解释说明 -->
<struts>
<!--
package:包,用于对Action进行封装
name:包名,根元素下可以有多个包,彼此不能重名
extends:继承,用于指定继承的包,相当于将继承包下的配置信息复制到当前包
namespace:命名空间,用于规定Action的访问路径,必须“/”开头 -->
<package name="test01" namespace="/test01" extends="struts-default">
<!--action:业务控制器,用于注册业务控制器组件
name:action名称,用于规定Action的访问路径
class:业务控制器组件,用于指定业务控制器对应的类
method:方法,用于指定访问当前action时要调用的方法
*请求URL:http://ip:port/projectName/namespace/ActionName.action
-->
<action name="hello" class="test01.konrad.action.HelloAction" method="execute">
<!--result:输出组件,用于转发、重定向、直接输出
name:名称,一个action下可以有多个result,彼此不能重名
默认值转发,元素内设置转发的页面
-->
<result name="success">
/hello.jsp
</result>
</action>
</package>
</struts>
<!-- SSH中的实例 -->
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<constant name="struts.devMode" value="false" />
<package name="shop" extends="struts-default" namespace="/">
<!-- 配置自定义拦截器 -->
<interceptors>
<interceptor name="privilegeInterceptor" class="cn.itcast.shop.interceptor.PrivilegeInterceptor"/>
</interceptors>
<global-results>
<result name="msg">/WEB-INF/jsp/msg.jsp</result>
<result name="login">/admin/index.jsp</result>
</global-results>
<!-- 配置首页访问的Action -->
<action name="index" class="indexAction">
<result name="index">/WEB-INF/jsp/index.jsp</result>
</action>
</struts>
四、Action
使用struts 2框架,主要的开发都是围绕action进行的,我们编写的action通常需要实现com.opensymphony.xwork2.Action接口。
1.action属性
action中有一个映射框架,主要是讲url映射到对应的action类,action的配置主要在struts.xml文件中编写,所有action的属性如下:
2.三种实现action的方式:
2.1 普通的POJO类(没有继承没有实现)——不常用
2.2 实现Action接口-基本不使用 ——不常用
Action接口中定义了5个常量,5个常量的值对应的是5个逻辑视图跳转页面(跳转的页面还是需要自己来配置),还定义了一个方法:execute方法。
5个逻辑视图的常量
- SUCCESS – 成功.
- INPUT – 用于数据表单校验.如果校验失败,跳转INPUT视图.
- LOGIN – 登录.
- ERROR – 错误.
- NONE – 页面不转向.
2.3 继承ActionSupport类 ——常用
<!-- SSH中的 后台登录Action 实例 -->
import com.opensymphony.xwork2.ActionSupport;
public class AdminUserAction extends ActionSupport implements
ModelDriven<AdminUser> {
// 模型驱动使用的对象
private AdminUser adminUser = new AdminUser();
public AdminUser getModel() {
return adminUser;
}
<!-- SSH 中 的 Struts.xml -->
<!-- 后台登录Action -->
<action name="adminUser_*" class="adminUserAction" method="{1}">
<result name="loginFail">/admin/index.jsp</result>
<result name="loginSuccess" type="redirect">/admin/home.jsp</result>
<interceptor-ref name="privilegeInterceptor">
<param name="excludeMethods">login</param>
</interceptor-ref>
<interceptor-ref name="defaultStack"/>
</action>
五、Result
1.介绍:
用于做输出的组件,用于向页面输出一些内容,转发、重定向可以理解为特殊方式的输出。每一个Result实际上是一个类,这些类都实现了共同的接口Result。Struts2预置了10种类型的Result,定义在strtus-default.xml
2.Result类型
a)dispatcher:用于转发的result,可以将请求转发给JSP,这种类型的Result对应的类为ServletDispacherResult,通过default=”true”指定该Result为Struts2默认的Result类型。
b)stream:用于向页面输出二进制数据,此种类型的Result可以将二进制数据输出到请求发起端,对应类为StreamResult
c)redirectAction:用于将请求重定向给另外一个Action,对应类为
ServletActionRedirectResult
d)json:用于向页面输出json格式的数据,可以将json字符串输出到请求发起端。对应类为JSONResult。json需要导包,修改package继承关系为json-default。