您的位置:首页 > 编程语言 > Java开发

笔记-struts2

2017-01-31 10:17 369 查看
1.struts2:主流的开发技术,很多公司都在用 基于mvc模式,mvc结构是一个优秀的设计思想,可以提高程序结构的灵活性便于日后的维护和扩展

特点:提供了action组件,充当struts1的Action和ActionForm的功能
提供了大量的result组件
提供了拦截器
可测性强,便于维护


2.struts的发展

strut1 实现了mvc架构-->最成熟的版本struts1.2-->
出现webwork-->webwork核心xwork基础上包装struts1(两种框架整合)-->struts2
*struts2不是struts1的升级版本,是webwork的升级版本


3.struts2实现MVC步骤:

struts2采用filter充当控制器--->根据struts.xml配置-->将请求分发给
不同的业务控制器action-->action处理业务返回字符串-->filter根据返回的字符串 -->在struts.xml中找到相应的result-->result根据请求转发页面


4.struts2的action工作原理:

1)发送请求-->到达控制器
2)-->根据请求创建valuestack对象,每个请求创建一个action对象
-->action对象存储 在valuestack的root区域,valuestack对象存放在request中,存储的值为struts.valuestack
3)控制器调用action接收请求参数,执行业务
4)控制器根据action返回值创建result视图组件处理
5)请求处理完成后,将valuestack对象和action销毁


5.在struts2中页面向Action传参

struts2中常用的传参方式有两种:基本属性注入和域模型注入
其中,基本属性注入是将表单中的数据,分别传给Action中声明的基本属性,要求 这些属性有set方法,并且名称与表单中框体的name值一致
域模型注入是将表单中的数据,传给Action中的一个实体对象,要求这个对象具有set方法,并且表单中框体的name中的表达式要有"对象.属性"的格式


6.struts2的配置文件

1)struts-default.xml
定义了很多result组件(默认result-type,dispatcher)和拦截器(默认default-stack),还有框架的核心bean
2)struts.xml(开发者创建)
可继承struts-default.xml


<struts>
<package namespace="/" extends="struts-defualt" name="">
<action name="login" class="cre.action.login" method="">
<result name="" type="dispatcher">
param name="location">/WEB-INF/ok.jsp</param>
**location
</result>
</action>
</package>
</struts>


定义开发者编写的Result组件,拦截器组件,Action组件
3)default.properties(框架自带)
定义了系统参数
4)struts.properties(由开发者创建并使用)
用于覆盖default.properties中内置系统参数
a.struts.i18n.encoding=UTF-8:默认编码格式
b.struts.action.extension=action,,:指定了请求的后缀
5)struts-plugin.xml
整合插件包中带的配置文件


7.OGNL

1)Object Graphics Navigation Language 对象图导航语言 ,属于表达式语言的一种,与EL表达式类似,OGNL技术是struts2中的核心知识它封装与ognl.jar中,ognl.jar工具包提供一个引擎,该引擎可以按照提供的ognl表达式访问对象数据和方法
2)OGNL工具构成
a.OGNL引擎,负责解析执行OGNL表达式
b.Root存储区,负责存储一个Object类型的对象,该存储区数据访问时,OGNL表达式格式为"属性"
c.Context存储区,负责存储一个Map类型的对象,该存储区数据访问时,ognl表达式格式为"#key"
3)OGNL作用
a.对对象的属性获取和设置
在java代码中使用:
ognl.Ognl.getValue("address.street", p);
ognl.Ognl.setValue("address.street", p, "齐鲁软件园A座");
在jsp页面中:
<s:property value="name"/>
b.调用对象的方法
<s:property value="#session.msg.length()"/>
c.调用静态属性和方法
调用静态属性:
<s:property value="@java.lang.Math@PI"/>
d.对集合进行过滤
<s:iterator value="list.{$#this.age >= 18}">
$最后一个元素
?所有元素
^第一个元素
e.支持java中的运算符和操作符
<s:iterator value="list.{$#this.age >= 18}">
f.定义list常量{"tom","sun"}
g.定义Map常量#{"key":"value","key2":"value2"}


8.struts2中各组件的作用

struts2有6大核心组件,分别为filter(前端控制器),Action(业务控制器),ValueStack(值对象),Interceptor(拦截器),Result(输出组件),Struts2标签
调用顺序:请求提交给前端控制器filter,它会根据struts.xml中的配置找到对应的业务控制器Action,再调用Action的业务方法,在调用过程中会被拦截器组件所拦截,最终根据Action方法的返回值,filter从struts.xml中可以找到对应的Result,使用这个Result向页面输出内容
最常见的输出实际上是将请求转发给一个JSP,在容器解析JSP生成HTML的过程中,S突突死标签将被解析,此时标签中的OGNL表达式会发送给ValueStack取值,返回的结果被写入最终生成的HTML


9.Struts2中Action相关配置

(1)<package>元素的namespace属性
用于指定package中的action对应的请求路径.
请求路径格式为:http://localhost:8080/工程名+struts.xml中的
namespace属性+<action>元素的name属性
(2)<action>元素的method属性
用于指定action中的业务方法名,默认为execute
(3)<param>元素
用于为Action,Result或拦截器组件的属性指定值.
(4)通配符*的使用name="opt"
<action>的name属性可以使用若干个*号,其他属性可以使用{1},{2}格式指定.
(5)动态方法调用
通过请求格式指定业务方法名.
格式:  请求名!方法名.action


10.ValueStack,ActionContext,ServletActionContext

(1)ValueStack
主要用于存储请求相关信息,内部结构如下:
root区域:被称为根存储区,是一个栈结构,栈顶元素为当前请求的Action对象
context区域:被称为变量存储区,是一个Map结构,存储了request,session,application等对象
(2)ActionContext用于获取context存储区内容,
可以将request,session,application对象以Map结构返回
ActionContext.getContext().getSession();
ActionContext.getContext().getApplication();
ActionContext.getContext().get("request");
(3)ServletActionContext是ActionContext子类,
可以获取Servlet API类型的对象


11.struts2的Interceptor组件

1)可以用于封装共通的业务处理,之后可以通过配置作用到Action组件上,使用方法灵活,便于维护
例如共通的业务:登录检查,日志记录,性能检测,事务处理
2)拦截器规范
a.拦截器组件必须实现Interceptor接口,实现interceptor方法
b.拦截器可以继承AbstractInterceptor类
c.拦截器组件可以继承MethodFilterInterceptor类
3)拦截器相关配置
a.声明
<interceptor name="拦截器名" class="包名.类名"/>
b.引用
<interceptor-ref name="拦截器名或拦截器栈名"/>
c.注意:当为Action组件引用了拦截器后,需要显式将defaultStack引入
4)声明拦截器


<interceptors>
<interceptor name="拦截器的名字" class"包名.类名""></interceptor>
<interceptor-stack name="拦截器栈的名字"></interceptor-stack>
<interceptor-ref></interceptor-ref>
</interceptors>


5)内置拦截器


//1.cookie解析
<interceptor name="cookie"     class="org.apache.struts2.interceptor.CookieInterceptor"/>
//2.清除session
<interceptor name="clearSession"  class="org.apache.struts2.interceptor.ClearSessionInterceptor" />
//3.创建session
<interceptor name="createSession" class="org.apache.struts2.interceptor.CreateSessionInterceptor" />
//4.关于调试的
<interceptor name="debugging" class="org.apache.struts2.interceptor.debugging.DebuggingInterceptor" />
//5.关于异常
<interceptor name="exception" class="com.opensymphony.xwork2.interceptor.ExceptionMappingInterceptor"/>
//6.关于文件上传
<interceptor name="fileUpload" class="org.apache.struts2.interceptor.FileUploadInterceptor"/>
(1)作用
调用上传文件解析器解析出上传文件,并将其放在临时目录下,在请求处理结束后将其删除.
(2)使用
a.编写Action组件,定义xxx,xxxFileName,xxxContentType,添加set方法
b.在Action业务方法中,将xxx临时文件对象复制到指定目录.
-----限定上传文件类型和大小
c.在struts.xml的action配置中,定义fileUpload拦截器的引用,并指定限定参数
<interceptor-ref name="fileUpload">
<param name="allowedTypes">image/jpeg,image/gif</param>
<param name="maximumSize">102400</param>
</interceptor-ref>
d.将Action组件继承ActionSupport,并在action配置中添加input视图
e.在input视图中使用<s:fielderror name=""/>标签显示提示信息
-----自定义提示信息<s:actionerror key="">
f.在struts.properties中指定资源文件位置struts.custom.i18n.resources=包名.资源文件名
g.在资源文件中覆盖原有提示信息
struts.messages.error.content.type.not.allowed=自定义消息
struts.messages.error.file.too.large=自定义消息
//7.关于国际化
<interceptor name="i18n" class="com.opensymphony.xwork2.interceptor.I18nInterceptor"/>
//8.关于日志记录
<interceptor name="logger" class="com.opensymphony.xwork2.interceptor.LoggingInterceptor"/>
//9.把请求信息封装在action中
<interceptor name="params" class="com.opensymphony.xwork2.interceptor.ParametersInterceptor"/>
//10.把配置文件中的参数给action传入
<interceptor name="staticParams" class="com.opensymphony.xwork2.interceptor.StaticParametersInterceptor"/>
//11.关于验证
<interceptor name="validation" class="org.apache.struts2.interceptor.validation.AnnotationValidationInterceptor"/>
//12.关于工作流
<interceptor name="workflow" class="com.opensymphony.xwork2.interceptor.DefaultWorkflowInterceptor"/>
//13.表单中的checkbox
<interceptor name="checkbox" class="org.apache.struts2.interceptor.CheckboxInterceptor" />
//14.关于重复表单提交的拦截器
<interceptor name="token" class="org.apache.struts2.interceptor.TokenInterceptor"/>
(1)token拦截器的使用
a.在JSP表单中添加<s:token/>标签.
b.在struts.xml的action配置中,添加token拦截器的引用
<interceptor-ref name="token"/>
token拦截器负责将表单中的ID与session
中ID对比
c.在struts.xml的action配置中,添加invalid.token视图.
如果拦截器发现重复提交,将自动调用此视图响应.
(2)tokenSession拦截器的使用
a,b两步与token的使用相同.不需要c步骤,tokenSession如果发现重复提交,将采用第一次提交的响应界面


6)异常拦截器


使用:
struts.xml:
<exception></exception>
<exception-mapping></exception-mapping>

<!-- 处理action组件抛出的异常 -->
<global-exception-mappings>
<exception-mapping result="fail" exception="java.sql.SQLException">
</exception-mapping>
</global-exception-mappings>


7)param拦截器


<interceptor name="params"
class="com.opensymphony.xwork2.interceptor.ParametersInterceptor"/>


8)自定义拦截器
a.实现Interceptor
b.继承AbstractInterceptor 实现interceptor方法
c.继承MethodFieldInterceptor 实现doIntercept方法(ActionInvocation invocation)
d.在xml配置


<interceptors>
<interceptor name="mylogger" class="">
<interceptor-stack>
<interceptor-ref></interceptor-ref>
</interceptor-stack>

<action>
<interceptor-ref name="mylogger"></interceptor-ref>
<param name="includeMethods">add,delete,update,init</param>
<interceptor-ref name="defaultstack"></interceptor-ref>
</action>


12.struts2的Result组件

dispatcher(默认) 以请求转发方式调用一个JSP,生成响应视图
redirect 以重定向的方式调用一个JSP,生成响应视图
redirectAction 以重定向方式调用一个action
chain 以请求转发方式调用一个action
stream 以字节流方式响应,将Action中指定的一个InputStream类型属性输出,将Action中的InputStream属性以字节流方式输出
json 以json字符串方式响应,将Action中指定的属性,拼成一个json字符串输出
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: