对Struts框架的理解

Struts 是Apache软件基金会(ASF)赞助的一个开源项目。它通过采用JavaServlet/JSP技术,实现了基于Java EE Web应用的MVC设计模式的应用框架,是MVC经典设计模式中的一个经典产品。 

一、什么是 MVC
1、M-Model 模型
模型( Model)的职责是负责业务逻辑。包含两部分:业务数据和业务处理逻辑。比如实体类、 DAO、 Service 都属于模型层。
2、V-View 视图
视图( View)的职责是显示界面和用户交互。属于视图的类是不包含业务逻辑和控制逻辑的 JSP。
3、C-Controller 控制器
控制器是模型层 M 和视图层 V 之间的桥梁,用于控制流程。比如我们之前项目中的 ActionServlet。

二、Struts2 发展史
1、最早出现的 Struts1 是一个非常著名的框架,它实现了 MVC 模式。 Struts1 简单小巧,其中最成熟的版本是 Struts1.2。
2、之后出现了 WebWork 框架,其实现技术比 Struts1 先进,但影响力不如 Struts1。
3、在框架技术不断发展的过程中,有人在 WebWork 的核心 XWork 的基础上包装了 Struts1,结合了 Struts1 的影响力和 WebWork 的先进技术, Struts2 诞生了。
4、 Struts2 不是 Struts1 的升级,它更像是 WebWork 的升级版本。

三、为什么要用 Struts
1、 JSP 用 HTML 与 Java 代码混用的方式开发,把表现与业务逻辑代码混合在一起给前期开发与后期维护带来巨大的复杂度。
2、解决办法:把业务逻辑代码从表现层中清晰的分离出来。

四、Struts2 提供的方便之处
1、数据的自动封装(输入属性)
根据页面组件的 name 属性,自动封装到 Action 中对应的 name 属性中,即自动调用某属性的 set 方法。
例如:在 JSP 页面<input name="name" type="text" />,而在 Action 中则会自动给属性 private String name 赋值。(必须有 name 属性对应的 get 和 set 方法) 
2、数据的自动传递(输出属性)
Action 中的属性在 JSP 页面可以直接用 EL 表达式拿到,即自动调用某属性的 get方法。
例如: Action 中的属性 private String name;在 JSP 页面上可以直接${name}得到对应的值。

五、Struts的工作流程
在web应用启动时就会加载初始化ActionServlet,ActionServlet从struts-config.xml文件中读取配置信息,把它们存放到各种配置对象中,当ActionServlet接收到一个客户请求时,将执行如下流程:
1、检索和用户请求匹配的ActionMapping实例,如果不存在,就返回请求路径无效信息
2、如果ActionForm实例不存在,就创建一个ActionForm对象,把客户提交的表单数据保存到ActionForm对象中
3、根据配置信息决定是否需要表单验证,如果需要验证,就调用ActionForm的validate()方法
4、如果ActionForm的validate()方法返回null或返回一个不包含ActionMessage的ActuibErrors对象,就表示表单验证成功
5、ActionServlet根据ActionMapping所包含的映射信息决定将请求转发给哪个Action,如果相应的Action实例不存在,就先创建这个实例,然后调用Action的execute()方法
6、Action的execute()方法返回一个ActionForward对象,ActionServlet在把客户请求转发给ActionForward对象指向的JSP组件
7、ActionForward对象指向JSP组件生成动态网页,返回给客户,至此结束

六、Struts2 使用步骤
1、创建一个 JavaWeb Project,命名为 strutsTest
2、拷贝 Struts2 的核心 Jar 包到 WEB-INF/lib/下,基本功能核心 jar 包 5 个:
(1) xwork-core-2.1.6.jar: Struts2 核心包,是 WebWork 内核。
(2) struts-core-2.1.8.jar: Struts2 核心包,是 Struts 框架的“外衣”。
(3) ognl-2.7.3.jar:用来支持 OGNL 表达式的,类似于 EL 表达式,功能比 EL 表达式强大的多。
(4)freemarker-2.3.15.jar: freemarker 是比 JSP 更简单好用,功能更加强大的表现层技术,用来替代 JSP 的。在 Struts2 中提倡使用 freemarker 模板,但实际项目中使用 JSP 也很多。
(5)commons-fileupload.jar:用于实现文件上传功能的 jar 包。
3、在 web.xml 中配置 Struts2 的前端控制器, Struts2 是用 Filter(过滤器)实现的前端控制器,它只负责根据请求调用不同的 Action(原来的项目是用 Servlet 的方式作为控制器
web.xml 内容:

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<!-- 上面的内容是规定必须写的,复制粘贴即可 -->
<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>
4、在 WebRoot 下新建 jsp 文件夹,并在其中创建 nameform.jsp 和 welcome.jsp
(1) nameform.jsp
<form action="welcome.action" method="post">
 <input name="name" type="text" /><input value="提交" type="submit" />
 <span style="color:red;">${error }</span>
</form>
(2) Welcome.jsp
<h1>Welcome, ${name}</h1>
5、在 com.audTest.action 包下创建 WelcomeAction 类

private String name; 
private String error; 
//各自的 get/set 方法略
public String execute() {
	System.out.println("WelcomeAction.execute()");
if(name==null||"".equals(name)){ 
	error="用户名不能为空"; return "fail"; }
	System.out.println("name: " + name);//用于测试
if ("test".equalsIgnoreCase(name)) { error="不能使用名字 text 登录";
	return "fail";
}else{ return "success"; } }

6、写 Struts2 所需要的控制器配置文件 struts.xml, 非常重要! 该文件写请求与各个 Action( Java 类)的对应关系,前端控制器会根据配置信息调用对应的 Action( Java 类)去处理请求
注意:
(1)在编写时 struts.xml 放在 src 目录中,而部署后该文件位于 WEB-INF/classes/下
(2)同样的, .properties 文件也放 src 下,部署后也在 WEB-INF/classes/下
(3)程序一启动, struts.xml 就会被加载到内存,并不是现读的
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><!-- struts 的根标签,也是规定,各个标签详解见 1.7 节 -->
 <package name="helloworld" namespace="/test" extends="struts-default" >
 <action name="welcome" class="com.audTest.action.WelcomeAction">
 <result name="success">/jsp/welcome.jsp</result>
 <result name="fail">/jsp/nameform.jsp</result>
 </action>
 </package>
 </struts>
7、部署,地址栏输入: http://localhost:8080/strutsTest/test/welcome.action 进行测试,发现一进入页面,则错误提示信息已经显示!为了解决该问题,需要再定义一个<action>用于读取页面,而不是发请求后立即执行 WelcomeAction 类进行处理,处理应当在点击提交后才执行。
8、在 struts.xml 中添加新的<action>仅仅用于读取页面
<action name="welcomeform"><!--不指明 class, Struts2 会自动创建一个类-->
<result name="success">/jsp/nameform.jsp</result>
</action>

9、重新部署,地址栏输入: http://localhost:8080/strutsTest/test/welcomeform.action 进行测试,可正常执行

七、struts.xml内容详解
1、<package>: 作用是为<action>分组, <struts>标签下可有多个<package>,而<package>标签有如下属性:
(1)name="helloworld":唯一的标识,表示包名为 helloworld。在相同包里的不能重复,不同包的可以重复!
(2)namespace="/test":用来设置该包中的 action 的地址的命名空间。
注意:命名空间中的“ /”要写,
(3)extends="struts-default":继承的包名,一般继承 Struts2 默认提供的 struts-default包,该包中定义了很多 Struts2 应用必须的组件(比如:拦截器);该 package 声明的位置在struts2-core-2.1.8.jar/struts-default.xml 文件中。
2、<action>: 作用是指明每个请求对应的 Action 类之间的对应关系(一个<action>对应一个请求 ), <package>下可有多个<action>。而<action>标签有如下属性:
(1)name="welcome":表示请求的名字为 welcome(即 welcome.action)
(2)class="com.audTest.action.WelcomeAction": 格式为“包名 . 类名”。 指定了对应的Action 类( Java 类)来处理请求。 class 属性可以不写,不写则 Struts2 会默认为该<action>添加一个 class( 自动创建一个类,该类中的 execute()方法只有一个 return "success";语句),作用是转发到对应的<result name="success">中指定的页面。
(3)method="xxx":用于指定在对应的 Action 类中要执行的方法名,该方法的返回值必须是 String 类型
例如: public String xxx(){...return string;}//返回的 string 是<result>标签中某个name 属性的值( 结果的名字)
若没有 method 属性或 method="",则默认调用方法名为 execute 的方法,即:public String execute(){...return string}。
3、<result>: 作用是指明执行相应的 Action 类之后,显示哪种结果页。而<result>标签有如下属性:
(1)name="success":是该 result 的名称, Action 返回哪一个 result 的 name 值,意味着要转发到哪一个 result 所对应的 JSP 地址, <result>不写 name 属性,则默认为 success。
(2)type="":默认 dispatcher(转发),还可写 json、stream等 等


 

   1. struts是一个按MVC模式设计的Web层框架,其实它就是一个大大的servlet,这个Servlet名为ActionServlet,或是ActionServlet的子类。我们可以在web.xml文件中将符合某种特征的所有请求交给这个Servlet处理,这个Servlet再参照一个配置文件(通常为/WEB-INF/struts-config.xml)将各个请求分别分配给不同的action去处理。    一个扩展知识点:struts的配置文件可以有多个,可以按模块配置各自的配置文件,这样可以防止配置文件的过度膨胀;    2. ActionServlet把请求交给action去处理之前,会将请求参数封装成一个formbean对象(就是一个java类,这个类中的每个属性对应一个请求参数),封装成一个什么样的formbean对象呢?看配置文件。    3.要说明的是, ActionServlet把formbean对象传递给action的execute方法之前,可能会调用formbean的validate方法进行校验,只有校验通过后才将这个formbean对象传递给action的execute方法,否则,它将返回一个错误页面,这个错误页面由input属性指定,(看配置文件)作者为什么将这里命名为input属性,而不是error属性,我们后面结合实际的运行效果进行分析。    4.action执行完后要返回显示的结果视图,这个结果视图是用一个ActionForward对象来表示的,actionforward对象通过struts-config.xml配置文件中的配置关联到某个jsp页面,因为程序中使用的是在struts-config.xml配置文件为jsp页面设置的逻辑名,这样可以实现action程序代码与返回的jsp页面名称的解耦。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值