Struts串讲
一、struts概述
1、Struts实现MVC设计模式
(1)Struts实质上就是在JSPModel2的基础山实现一个MVC框架。
1)模型:由业务实现业务逻辑的JavaBean或EJB组件构成
2)控制器:由ActionServlet和Action来实现
3)视图:由一组JSP文件构成
(2)
2、Struts的工作流程
(1)Web应用启动时加载并初始化ActionServlet,ActionServlet从struts-config.xml中读取配置信息,把它们存放到各种配置对象中。
(2)当ActionServlet接收到一个客户请求时,检索和用户请求匹配的ActionMapping实例,如果不存在,就返回用户请求路径无效的信息。
(3)如果ActionForm实例不存在,就创建一个ActionForm对象,把客户提交的表单数据保存到ActionForm对象中。
(4)根据配置信息决定是否需要表单验证。如果需要验证,就调用ActionForm的validate()。
(5)ActionForm的validate()方法
1)如果返回null或返回一个不包含ActionMessage的ActionErrors对象,就表示表单验证成功。
2)如果返回一个包含一个或多个ActionMessage的ActionErrors对象,就表示表单验证失败,此时ActionServlet将直接把请求转发给包含用户提交表单的JSP组件。在这种情况下,不会再创建Action对象并调用Action的execute()方法。
(6)ActionServlet根据ActionMapping实例包含的映射信息决定将请求转发给哪个Action。如果相应的Action实例不存在,就先创建这个实例,然后调用Action的execute()方法。
(7)Action的execute()方法返回一个ActionForward对象,ActionServlet再把客户请求转发给ActionForward对象指向的JSP组件。
(8)ActionForward对象指向的JSP组件生成动态网页,返回给客户。
request response
forward
dispatch
二、Struts 1.2X 构成
1、struts运行需要的jar包
(1)commons-digester.jar 用于解析配置文件
(2)commons-fileupload.jar 用于实现文件上传(进行了进一步的封装)
(3)commons-logging.jar 用于日志处理
(4)commons-beanutils.jar 用于POJO的属性赋值、拷贝等
(5)commons-validator.jar 用于表单验证
2、 struts标记库文件(tld)
(1)struts-bean.tld
(2)struts-html.tld
(3)struts-logic.tld
(4)struts-nested.tld
(5)struts-tiles.tld
3、配置文件struts-config.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.2//EN" "http://struts.apache.org/dtds/struts-config_1_2.dtd">
<struts-config>
<data-sources />
<form-beans>
<form-bean name="xxx" type="ActionForm的类全名">
<form-bean name="LoginForm" type="basic.LoginForm">
</form-beans>
<global-exceptions />
<global-forwards />
<action-mappings >
<action path="action的路径,在form的action中写的那个路径"
type="Action的类全名" name="form的名字"
scope="request|session(默认值)">
<forward name="在自定义的Action中使用的findForward方法的参数"
path="跳转页面的路径" redirect="false"(重定向,默认false)/>
</action>
</action-mappings>
<message-resources parameter="资源文件的名字(不加后缀)" />
</struts-config>
4、资源文件
<message-resources parameter="ApplicationResources" >
</message-resources>
使用资源文件的步骤:
(1) 确认资源文件的jar导入
(2) 引入标记库
<%@tagliburi="/WEB-INF/struts-bean.tld" prefix="bean" %>
(3) 使用:
ApplicationResources.properties文件以“消息key、消息文本”格式存放数据
eg.
ApplicationResources.properties中:
jsp.user=username
test.jsp中:
<bean:message key="jsp.user"/>
注意:ApplicationResources.properties文件不支持中文,如果想在页面中展示中文只能把中文转为unicode码,命令:native2ascii 原文件名 目标文件名。
国际化:按照浏览器所要求的语言选择资源文件。前面相同,后缀不同。
eg.
<message-resources parameter="ApplicationResources" >
</message-resources>
资源文件名为:ApplicationResources_zh.properties(中文)
ApplicationResources_en.properties(英文)
也可以加上国家名
ApplicationResources_zh_CN.properties(中文)
ApplicationResources_en_US.properties(英文)
注意:资源文件的选择:首先查找和浏览器语言匹配的资源文件,如果找不到则找和服
务器的语言地区相匹配资源文件,如果还是找不到就查找默认不带语言后缀的资源文
件。
三、Struts1.2核心控制流程
1、主要组件:
(1)ActionServlet组件:充当Struts框架的中央控制器
(2)RequestProcessor组件:充当每个子应用模块的请求处理器
(3)Action组件:负责处理一项具体的业务。
2、ActionServlet
(1)Struts的启动通常从加载ActionServlet开始(如果没有其他Servlet的加载优先级比它高)。ActionServlet在应用一加载时即会被实例化并调用其init方法。
(2)init方法所做的主要工作有:
1)加载struts配置文件,并创建用于封装配置信息的ModuleConfig对象
2)加载资源文件,并创建用于封装资源文件的MessageResources对象。
另外,如果有相应配置的话,init方法还将初始化数据源和PlugIn
注意:
1)如果web.xml有多模块配置,将创建多个ModuleConfig对象和MessageResources对象分别用于封装各个模块的struts配置文件和资源文件。
eg. 多模块:
<init-param>
<param-name>config</param-name>
<param-value>/WEB-INF/struts-config.xml</param-value>
</init-param>
<!-- config后面的/ma表示模块名,访问ma模块里的配置文件的action中的url路径位:应用路径/模块名/url.do -->
<init-param>
<param-name>config/ma</param-name>
<param-value>/WEB-INF/ma/struts-config.xml</param-value>
</init-param>
<init-param>
<param-name>config/mb</param-name>
<param-value>/WEB-INF/mb/struts-config.xml</param-value>
</init-param>
或者
<init-param>
<param-name>config</param-name>
<param-value>/WEB-INF/struts-config.xml</param-value>
</init-param>
<init-param>
<param-name>config/catalog</param-name>
<param-value>/WEB-INF/ma-struts-config.xml</param-value>
</init-param>
<init-param>
<param-name>config/authorize</param-name>
<param-value>/WEB-INF/mb-struts-config.xml</param-value>
</init-param>
2)针对各个模块所创建的ModuleConfig对象和MessageResources对象将存储在ServletContext中,对应的属性名中有该模块名称的相应标识。
(3)ActionServlet的process()方法的主要工作有:
1)根据请求信息获知所请求的模块名称,从ServletContext中获得与请求模块对应的的
ModuleConfig对象,并存储到request中。
2)根据模块信息获得相应的RequestProcessor对象,一个模块对应一个RequestProcessor
对象,RequestProcessor对象将关联与所属模块对应的ModuleConfig;
评论