概述
一、struts2的概念
来自百度百科:
Struts2是一个基于MVC设计模式的Web应用框架,它本质上相当于一个servlet,在MVC设计模式中,Struts2作为控制器(Controller)来建立模型与视图的数据交互。
是由传统Struts1和WebWork两个经典框架发展而来,但主要核心还是Webwork。采用拦截器的机制来处理用户的请求,使业务逻辑控制器与Servlet API完全脱离开。
二、struts2的流程
Struts2的下载和安装
http://struts.apache.org/download.cgi 去下载Struts2 最新版
struts2常与spring、hibernate构成SSH框架;
在使用struts2框架的过程中,需要两个配置文件,分别为web.xml和struts.xml,服务器一启动就加载web.xml的配置,web.xml启动时,在StrutsPrepareAndExecuteFilter的init()方法中将会读取类路径下默认的配置文件struts.xml完成初始化操作;struts2读取到struts.xml后,以javabean形式存放在内存中,以后struts2对用户的每次请求处理将使用内存中的数据,而不是每次都读取struts.xml文件。
(1) 客户端(Client)向Action发用一个请求(Request)
(2) Container通过web.xml映射请求,并获得控制器(Controller)的名字
(3) 容器(Container)调用控制器(StrutsPrepareAndExecuteFilter或FilterDispatcher)。在Struts2.1以前调用FilterDispatcher,Struts2.1以后调用StrutsPrepareAndExecuteFilter
(4) 控制器(Controller)通过ActionMapper获得Action的信息
(5) 控制器(Controller)调用ActionProxy
(6) ActionProxy读取struts.xml文件获取action和interceptor stack的信息。
(7) ActionProxy把request请求传递给ActionInvocation
(8) ActionInvocation依次调用action和interceptor
(9) 根据action的配置信息,产生result
(10) Result信息返回给ActionInvocation
(11) 产生一个HttpServletResponse响应
(12) 产生的响应行为发送给客服端。
三、struts2的使用
1.web.xml的配置
因为Struts2将核心控制器设计成Filter,而不是一个普通Servlet。故为了让Web应用加载FilterDispatcher,只需要在web.xml文件中配置FilterDispatcher即可。
标准配置文件如下:
<?xml version="1.0" encoding="UTF-8"?>
<web-app id="WebApp_9" 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">
<display-name>Struts Blank</display-name>
<filter>
<!-- 配置Struts2核心Filter的名字 -->
<filter-name>struts2</filter-name>
<!-- 配置Struts2核心Filter的实现类 -->
<filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
<init-param>
<!-- 配置Struts2框架默认加载的Action包结构,可以没有。 -->
<param-name>actionPackages</param-name>
<param-value>org.apache.struts2.showcase.person</param-value>
</init-param>
<!-- 配置Struts2框架的配置提供者类 -->
<init-param>
<param-name>configProviders</param-name>
<param-value>lee.MyConfigurationProvider</param-value>
</init-param>
</filter>
<!-- 配置Filter拦截的URL -->
<filter-mapping>
<!-- 配置Struts2的核心FilterDispatcher拦截所有用户请求 -->
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
</welcome-file-list>
</web-app>
*如上,当配置Struts2的FilterDispatcher类时,可以指定一系列的初始化参数,为该Filter配置初始化参数时,其中有3个初始化参数有特殊意义:
config:使用逗号隔开的字符串,每个字符串都是一个XML配置文件的位置。Struts框架将自动加载该属性指定的系列配置文件。
actionPackages:使用逗号隔开的字符串,每个字符串都是一个包空间,Struts2框架将扫描这些包空间下的Action。
configProviders:配置自己的ConfigurationProvider类。
还可以在此处配置Struts2常量,每个<init-param>元素配置一个Struts2常量,其中<param-name>子元素指定了常量name,而<param-value>子元素指定了常量value。
*在web.xml中配置了<Filter>元素,还需要配置该Filter拦截的URL。通常,我们让该Filter拦截所有的用户请求。可以能过<filter-mapping>元素配置。
2.struts.xml的配置
<?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>
<!-- consant 常量,struts.devMode表示开发者模式,当为true时如果改变了其中的一些代码,可以不用重新启动tomcat-->
<constant name="struts.devMode" value="true" />
<!--package可以有多个解决重名的情况, namespace 可以不写,默认是如何路径都可以,也可以写成/xx/yy ,必须是/开头-->
<package name="default" namespace="/" extends="struts-default">
<default-action-ref name="index" />
<global-results>
<result name="error">/error.jsp</result>
</global-results>
<global-exception-mappings>
<exception-mapping exception="java.lang.Exception" result="error"/>
</global-exception-mappings>
<!-- action里面那个name属性值得是URL输入的路径名 ,如“http://localhost:8080/Struts2Demo/hello”,则会根据result反馈Hello.jsp-->
<action name="hello" class="com.styspace.struts2.action.action2">
<result> /Hello.jsp</result>
</action>
<!-- action里面class属性值,会有对应的这个类,执行该类里面的execute()方法-->
<action name="action" class="com.styspace.struts2.action.action2">
<result name="success">/Action.jsp</result>
</action>
<!-- action里面method属性值,会有对应class这个类中的add方法,然后执行该方法-->
<action name="userAdd" class="com.bjsxt.struts2.user.action.UserAction" method="add">
<result>/user_add_success.jsp</result>
</action>
<!-- 一般action里面不用method属性值,而是用DMI(动态方法调用)可以通过http://localhost:8080/Struts2Demo/user!addURL调用,其中user指的是action中的name值-->
<action name="user" class="com.bjsxt.struts2.user.action.UserAction">
<result>/user_add_success.jsp</result>
</action>
<!-- 更简单的方法,通配符,name=“student*”会匹配URL中所有Studentxx,而method=“{1}”指的是name中第一个“*”匹配的值 同理,result中{1}也是一样的-->
<action name="Student*" class="com.bjsxt.struts2.action.StudentAction" method="{1}">
<result>/Student{1}_success.jsp</result>
</action>
<!-- 甚至可以有多个通配符,class属性中也可以用{1}来匹配,最简化-->
<action name="*_*" class="com.bjsxt.struts2.action.{1}Action" method="{2}">
<result>/{1}_{2}_success.jsp</result>
<!-- {0}_success.jsp -->
</action>
</package>
<!-- Add packages here -->
</struts>
3.struts的注解开发方式
常用注解
@NameSpace
-
出现的位置:它只能出现在
- package上或者Action类上。一般情况下都是写在Action 类上。
- 作用:指定当前Action 中所有动作方法的名称空间。
- 属性:
- value:指定名称空间的名称。写法和 xml配置时一致。不指定的话,默认名称空间是”“。
@ParentPackage
- 出现的位置:
- 它只能出现在 package上或者Action类上。一般情况下都是写在Action类上。
- 作用:指定当前动作类所在包package标签的父包。
- 由于我们已经是在类中配置了,所以无需在指定包名了。
-
属性:
- value:指定父包的名称。
@Action
-
出现的位置:
- 它只能出现在 Action类上或者动作方法上。一般情况下都是写在动作方法上。
- 作用:指定当前动作方法的动作名称。
- 也就是 xml配置时 action标签的name 属性。
- 属性:
- value:指定动作名称。
- results[]:它是一个数组,数据类型是注解。用于指定结果视图。此属性可以没有,当没有
该属性时,表示不返回任何结果视图。即使用 response 输出响应正文。
interceptorRefs[]:它是一个数组,数据类型是注解。用于指定引用的拦截器。
@Result
-
出现的位置:
- 它可以出现在动作类上,也可以出现在 Action注解中。
- 作用:出现在类上,表示当前动作类中的所有动作方法都可以用此视图。
- 出现在Action注解中,表示当前Action可用此视图。
- 属性:
- name:指定逻辑结果视图名称。
- type :指定前往视图的方式。例如:请求转发,重定向,重定向到另外的动作。
- location:指定前往的地址。可以是一个页面,也可以是一个动作。
- 注意 : 此注意是一个数组,在Action注解中的写法:可配多个试图
result={
@Result(name="",type="",location=""),
@Result(name="",type="",location="")
}
@Results
- 出现的位置:
- 它可以出现在动作类上,也可以出现在 Action注解中。
- 作用:用于配置多个结果视图。
-
属性:
- value:它是一个数组,数据类型是result注解。
- 注意 : 是写在动作类上,而且可以写多个,写在Action类上后,方法就不用配置@Result注解
@InterceptorRef
-
出现的位置:
- 它可以出现在动作类上或者Action注解中。
- 作用:用于配置要引用的拦截器或者拦截器栈
- 属性:
- value:用于指定拦截器或者拦截器栈常用注解
四、对请求参数的封装
1、属性驱动
1.1、 无实体类★
属性驱动-set方式(常用场景-分页)
只需要在action中通过相应的属性(需要有set方法)
1.2、 有实体类★
属性驱动-页面表达式方式(常用场景-封装成多个对象)
将页面传递过来的数据封装成一个对象
在action中,提供一个javabean对象,提供他的get和set方法
在页面中,修改表单子标签的name属性
name="javabean对象名称.bean属性名称"
2、模型驱动★★(最常用到)
步骤:
1.action要实现ModelDriven接口
2.在action中提供一个javabean对象(必须初始化)
3.重写接口的getModel方法
4.将javabean对象通过getModel方法的返回.
3、封装集合数据(不常用)
大前提:
action中需要提供一个集合,提供这个集合的get和set方法.
批量封装成list
修改页面上的表单子标签的name属性
name="集合属性名称[索引].bean属性"
批量封装成map
修改页面上的表单子标签的name属性
name="集合属性名称['key名称'].bean属性"
Strurs2的拦截器:
过滤器是servlet规范中的一部分,任何java web项目都可以使用。
拦截器是struts2框架自己的,只用使用struts2框架的工程才能使用。
过滤器在url-pattern中配置/*之后,可以对所有要访问的资源拦截。
拦截器他是只有struts2核心内部后,才会起作用,如果访问的是jsp、html、css、image或者js是不会进行拦截的。
同时。拦截器是AOP思想的具体体现形式。
参考文章:
https://www.cnblogs.com/huskyking/p/5557681.html
https://blog.csdn.net/u011958281/article/details/74685659
https://blog.csdn.net/Kato_op/article/details/80295731
https://www.cnblogs.com/jimsu/p/6045794.html
最后
以上就是标致钢铁侠为你收集整理的对struts2简单理解,未完待续的全部内容,希望文章能够帮你解决对struts2简单理解,未完待续所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复