本文学习资源:《STRUTS 2完全自习手册》
概述
MVC
Model-View-Controller ,一种目前广泛流行的软件设计架构模式。
MVC模块层关系
MVC处理过程
Model1
传统JSP嵌套HTML代码的模式
Model2
MVC模式
Strusts2结构体系
Strusts2配置文件
struts.xml
创建Struts2应用,首先需要Struts2的核心配置文件 struts.xml,该文件用来配置Action
定义Action,指定该Action的调用名称、实现类、及该Action的处理结果和返回视图映射关系。
struts.xml示例:
<!DOCType STRUTS PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd">
<package name="default" extends="struts-default">
<action name="login" class="struts-default"> 配置Action
<result>/success.jsp</result> 配置success返回视图
<result name="input">/login.jsp</result> 配置input返回视图
</action>
</package>
</struts>
result 属性:
- name
- type 指定转向的资源类型,默认类型为JSP。如果需要转向其它Action,则需要指定转向类型,设置type属性值为redirect
struts.properties
配置全局属性
struts.i18n.reload=true
struts.i18n.encoding=gb2312
Struts2 控制器
核心控制器
FilterDispatcher
在Web应用中负责拦截所有的用户请求。在Struts2应用中起作用的业务控制器实际上不是用户自定义的Action,而是系统生成的Action代理,但是该Action代理以用户自定义的Action为目标。
业务控制器
Action
Action示例:
package action;
public class Login{
private String userName;
private String userPassword;
public String execute(){
return "success"; // or return "error";
}
}
业务控制器一般都有一个execute()方法,该方法返回一个字符串,这个字符串是一个逻辑视图名,通过配置后对应一个视图。
业务逻辑组件
Struts2中使用Pojo
Struts2 标签库
示例
<%@ page language="java" import="java.util.*" pageEncoding="gb2312" %>
<%@ taglib prefix="s" uri="/struts-tags" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
<html>
<body>
<s:form actio="add">
<s:textfield name="name" label="姓名" />
<s:submit value="添加" />
</s:form>
</body>
</html>
Struts2 运行流程分析
内容来源《[尚硅谷]_佟刚_Struts2 运行流程分析》
1. 请求发给StrutsPrepareAndExecuteFilter
2. StrutsPrepareAndExecuteFilter 询问ActionMapper,该请求是否是一个Struts2请求(即是否返回一个非空的ActionMapping对象)
3. 若ActionMapper认为该请求是一个Struts2请求,则StrutsPrepareAndExecuteFilter把请求处理交给ActionProxy
4. ActionProxy通过ConfigurationManager询问框架的配置文件,确定需要调用的Action类及Action方法
5. ActionProxy创建一个ActionInvocation的实例,并进行初始化
6. ActionInvocation实例在调用Action的过程前后,涉及到相关拦截器(Intercepter)的调用
7. Action执行完毕,ActionInvocation负责struts.xml中的配置找到对应的返回结果。调用结果的execute方法,渲染结果。在渲染的过程中可以使用Struts2框架中的标签。
8. 执行各个拦截器invocation.invoke()之后的代码
9. 把结果发送到客户端
时序图: