struts2怎么念,请你谈谈对struts2的理解
struts2怎么念,请你谈谈对struts2的理解详细介绍
本文目录一览: struts怎么读
读法可以参考百度翻译的结果
struts 英[st'r?ts] 美[st'r?ts]
n. (框架的)支杆( strut的名词复数 );支柱;趾高气扬的步态;(尤指跳...
v. 趾高气扬地走,高视阔步( strut的第三人称单数 )
[例句]
1."Even at these forces, only a few struts of bone might break; these would healeasily," he said.
“即使在这种压力下剑角龙骨骼中也只有一些小支柱的骨头才会断裂而且这些骨骼很容易恢复”他说.
2.Rewalk consists of a set of plastic-covered aluminium struts, linked byactuator motors, that are strapped to the user's legs and waist, and abackpack.
“重新行走”包括马达驱动器连接塑料覆盖的铝制支柱,绑在使用者的腿部和腰部,以及一个背包。
3.The right approach towards bonuses has three struts.
正确处理奖金问题有三个原则。
4.Undo the three fastening screws for the spring struts at the left and right.
旋开左右两侧减震器的三颗紧固螺钉。
5.The wild popularization of this structure for web applications is due to itsinclusion in two development frameworks that have become immenselypopular: struts and ruby on rails.
这种架构模式的疯狂流行是由于两个极其流行的开发框架将这种模式包含了进来,它们是:struts和ruby on rails。
Struts2简介
一 什么是Struts ?
虽然Struts 号称是一个全新的框架 但这仅仅是相对Struts 而言 Struts 与Struts 相比 确实有很多革命性的改进 但它并不是新发布的新框架 而是在另一个赫赫有名的框架 WebWork基础上发展起来的 从某种程度上来讲 Struts 没有继承Struts 的血统 而是继承WebWork的血统 或者说 WebWork衍生出了Struts 而不是Struts 衍生了Struts 因为Struts 是WebWork的升级 而不是一个全新的框架 因此稳定性 性能等各方面都有很好的保证 而且吸收了Struts 和WebWork两者的优势 因此 是一个非常值得期待的框架
Apache Struts 是一个优雅的 可扩展的JAVA EE web框架 框架设计的目标贯穿整个开发周期 从开发到发布 包括维护的整个过程
Apache Struts 即是之前大家所熟知的WebWork 在经历了几年的各自发展后 WebWork和Struts社区决定合二为一 也即是Struts
Struts 和Struts 的不同
Action 类
◆Struts 要求Action类继承一个抽象基类 Struts 的一个普遍问题是使用抽象类编程而不是接口
◆Struts Action类可以实现一个Action接口 也可实现其他接口 使可选和定制的服务成为可能 Struts 提供一个ActionSupport基类去实现 常用的接口 Action接口不是必须的 任何有execute标识的POJO对象都可以用作Struts 的Action对象
线程模式
◆Struts Action是单例模式并且必须是线程安全的 因为仅有Action的一个实例来处理所有的请求 单例策略限制了Struts Action能作的事 并且要在开发时特别小心 Action资源必须是线程安全的或同步的
◆Struts Action对象为每一个请求产生一个实例 因此没有线程安全问题 (实际上 servlet容器给每个请求产生许多可丢弃的对象 并且不会导致性能和垃圾回收问题)
Servlet 依赖
◆Struts Action 依赖于Servlet API 因为当一个Action被调用时HttpServletRequest 和 HttpServletResponse 被传递给execute方法
◆Struts Action不依赖于容器 允许Action脱离容器单独被测试 如果需要 Struts Action仍然可以访问初始的request和response 但是 其他的元素减少或者消除了直接访问HttpServetRequest 和 HttpServletResponse的必要性
可测性
◆测试Struts Action的一个主要问题是execute方法暴露了servlet API(这使得测试要依赖于容器) 一个第三方扩展——Struts TestCase——提供了一套Struts 的模拟对象(来进行测试)
◆Struts Action可以通过初始化 设置属性 调用方法来测试 依赖注入 支持也使测试更容易
捕获输入
◆Struts 使用ActionForm对象捕获输入 所有的ActionForm必须继承一个基类 因为其他JavaBean不能用作ActionForm 开发者经常创建多余的类捕获输入 动态Bean(DynaBeans)可以作为创建传统ActionForm的选择 但是 开发者可能是在重新描述(创建)已经存在的JavaBean(仍然会导致有冗余的javabean)
◆ Struts 直接使用Action属性作为输入属性 消除了对第二个输入对象的需求 输入属性可能是有自己(子)属性的rich对象类型 Action属性能够通过web页面上的taglibs访问 Struts 也支持ActionForm模式 rich对象类型 包括业务对象 能够用作输入/输出对象 这种ModelDriven 特性简化了taglib对POJO输入对象的引用
表达式语言
◆Struts 整合了JSTL 因此使用JSTL EL 这种EL有基本对象图遍历 但是对集合和索引属性的支持很弱
◆Struts 可以使用JSTL 但是也支持一个更强大和灵活的表达式语言—— Object Graph Notation Language (OGNL)
绑定值到页面(view)
◆ Struts 使用标准JSP机制把对象绑定到页面中来访问
◆Struts 使用 ValueStack 技术 使taglib能够访问值而不需要把你的页面(view)和对象绑定起来 ValueStack策略允许通过一系列名称相同但类型不同的属性重用页面(view)
类型转换 ◆Struts ActionForm 属性通常都是String类型 Struts 使用Commons Beanutils进行类型转换 每个类一个转换器 对每一个实例来说是不可配置的
◆Struts 使用OGNL进行类型转换 提供基本和常用对象的转换器
校验 ◆Struts 支持在ActionForm的validate方法中手动校验 或者通过Commons Validator的扩展来校验 同一个类可以有不同的校验内容 但不能校验子对象
◆Struts 支持通过validate方法和XWork校验框架来进行校验 XWork校验框架使用为属性类类型定义的校验和内容校验 来支持chain校验子属性Action执行的控制 ◆Struts 支持每一个模块有单独的Request Processors(生命周期) 但是模块中的所有Action必须共享相同的生命周期
◆Struts 支持通过拦截器堆栈(Interceptor Stacks)为每一个Action创建不同的生命周期 堆栈能够根据需要和不同的Action一起使用
Struts 的工作流程图
工作流程图
工作流程当接收到一个request Interceptor做一些拦截或者初始的工作当外部的ervletrequest到来时初始到了servlet容器 传递给一个标准的过滤器链ActionContextCleanUp这个在集成插件方面非常有用Other filters(SitMesh etc)
调用FilterDispatecher会去查找相应的ActionMapper如果找到了相应的ActionMapper它将会将控制权限交给ActionProxy ActionProxy将会通过ConfigurationManager来查找配置struts xml下一步将会 通过ActionInvocation来负责命令模式的实现(包括调用一些拦截Interceptor框架在调用action之前)
一旦action返回 会查找相应的Result Result类型可以是 jsp或者freeMark 等这些组件和ActionMapper一起返回给请求的url(注意拦截器的执行顺序)
lishixinzhi/Article/program/Java/ky/201311/28090
Struts2教程3:struts.xml常用配置解析
使用<include>标签重用配置文件
在Struts 中提供了一个默认的struts xml文件 但如果package action interceptors等配置比较多时 都放到一个struts xml文件不太容易维护 因此 就需要将struts xml文件分成多个配置文件 然后在struts xml文件中使用<include>标签引用这些配置文件 这样做的优点如下
结构更清晰 更容易维护配置信息
配置文件可以复用 如果在多个Web程序中都使用类似或相同的配置文件 那么可以使用<include>标签来引用这些配置文件 这样可以减少工作量
假设有一个配置文件 文件名为newstruts xml 代码如下
<?xmlversion= encoding= UTF ?><!DOCTYPEstrutsPUBLIC //ApacheSofareFoundation//DTDStrutsConfiguration //EN dtd ><struts><packagename= demo extends= struts default ><actionname= submit class= action MoreSubmitAction ><resultname= save >/result jsp</result><resultname= print >/result jsp</result></action></package></struts>
则struts xml引用newstruts xml文件的代码如下
<?xmlversion= encoding= UTF ?><!DOCTYPEstrutsPUBLIC //ApacheSofareFoundation//DTDStrutsConfiguration //EN dtd ><struts><includefile= newstruts xml /><packagename= test extends= struts default >……</package></struts>
大家要注意一下 用<include>引用的xml文件也必须是完成的struts 的配置 实际上<include>在引用时是单独解析的xml文件 而不是将被引用的文件插入到struts xml文件中
action的别名
在默认情况下 Struts 会调用动作类的execute方法 但有些时候 我们需要在一个动作类中处理不同的动作 也就是用户请求不同的动作时 执行动作类中的不同的方法 为了达到这个目的 可以在<action>标签中通过method方法指定要指行的动作类的方法名 并且需要为不同的动作起不同的名子(也称为别名) 如下面代码所示
<?xmlversion= encoding= UTF ?><!DOCTYPEstrutsPUBLIC //ApacheSofareFoundation//DTDStrutsConfiguration //EN dtd ><struts><packagename= demo extends= struts default ><actionname= test class= action MyAction >……</action><actionname= my class= action MyAction method= my >……</action></package></struts>
上面代码的两个动作的class属性都指向同一个类 name为这个类起了两个动作别名 test和my 在动作my中 使用了method属性指定要要运行的方法名为my
在MyAction类中必须要有my方法 代码如下
packageaction;import opensymphony xwork ActionSupport;publicclassMyActionextendsActionSupport{……publicStringexecute()throwsException{//处理test动作的代码}publicStringmy()throwsException{ //处理my动作的代码}……}
除了在struts xml中配置别名 还可以通过请求参数来描述指定动作(并不需要在struts xml中配置) 请求参数的格式如下
//localhost /contextPath/actionName!method action
关于通过请求指定动作的详细内容 请参阅笔者写的《Struts 教程 处理一个form多个submit》
为action指定参数
在struts 中还可以为action指定一个或多个参数 大家还记着struts x是如何设置的action参数不? 在struts x中可以使用<action>标签的parameter属性为其指定一个action参数 如果要指定多个 就只能通过逗号( )或其他的分隔符将不同的参数隔开 而在struts 中可以通过<param>标签指定任意多个参数 代码如下
<actionname= submit class= action MyAction ><paramname= param >value </param><paramname= param >value </param><resultname= save >/result jsp</result> ……</action>
当然 在action中读这些参数也非常简单 只需要象获取请求参数一样在action类中定义相应的setter方法即可(一般不用定义getter方法) 如下面的代码将读取param 和param 参数的值
packageaction;import opensymphony xwork ActionSupport;publicclassMyActionextendsActionSupport{privateStringparam ;privateStringparam ;publicStringexecute()throwsException{System out println(param +param );}publicvoidsetParam (Stringparam ){this param =param ;}publicvoidsetParam (Stringparam ){this param =param ;}……}
当struts 在调用execute之前 param 和param 的值就已经是相应参数的值了 因此 在execute方法中可以直接使用param 和param
选择result类型
在默认时 标签的type属性值是 dispatcher (实际上就是转发 forward) 开发人员可以根据自己的需要指定不同的类型 如redirect stream等 如下面代码所示
<result name= save type= redirect > /result jsp</result>
这此result type可以在struts core jar包或struts 源代码中的struts default xml文件中找到 在这个文件中找到<result types>标签 所有的result type都在里面定义了 代码如下
<result types> <result typename= chain class= opensymphony xwork ActionChainResult /> <result typename= dispatcher class= apache struts dispatcher ServletDispatcherResult default= true /> <result typename= freemarker class= apache struts views freemarker FreemarkerResult /> <result typename= header class= apache struts dispatcher HttpHeaderResult /> <result typename= redirect class= apache struts dispatcher ServletRedirectResult /> <result typename= redirectAction class= apache struts dispatcher ServletActionRedirectResult /> <result typename= stream class= apache struts dispatcher StreamResult /> <result typename= velocity class= apache struts dispatcher VelocityResult /> <result typename= xslt class= apache struts views xslt XSLTResult /> <result typename= plainText class= apache struts dispatcher PlainTextResult /> <! DeprecatednameformscheduledforremovalinStruts ThecamelCaseversionsarepreferred Seeww > <result typename= redirect action class= apache struts dispatcher ServletActionRedirectResult /> <result typename= plaintext class= apache struts dispatcher PlainTextResult /></result types>
全局result
有很多时候一个<result>初很多<action>使用 这时可以使用<global results>标签来定义全局的<result> 代码如下
<struts><packagename= demo extends= struts default ><global results><resultname= print >/result jsp</result></global results><actionname= submit class= action MoreSubmitAction > ……</action><actionname= my class= action MoreSubmitAction method= my >……</action></package></struts>
lishixinzhi/Article/program/Java/ky/201311/27860
struts2是什么
Struts2 是提供一个ActionSupport基类 去实现常用的接口。即使Action接口不是必须实现的,只有一个包含
execute方法的POJO类都可以用作Struts2的Action。
一个Java框架。MVC模式中,Struts2 是处于Control层中用于分发命令给后台业务组件的。
java编程语言的一个框架
Struts 2是Struts的下一代产品。是在 struts 和WebWork的技术基础上进行了合并,全新的Struts 2框架。其全新的Struts 2的体系结构与Struts 1的体系结构的差别巨大。Struts 2以WebWork为核心,采用拦截器的机制来处理用户的请求,这样的设计也使得业务逻辑控制器能够与Servlet API完全脱离开,所以Struts 2可以理解为WebWork的更新产品。因为Struts 2和Struts 1有着太大的变化,但是相对于WebWork,Struts 2只有很小的变化。
struts1和struts2的区别??
一、主体不同
1、struts1:是Apache软件基金会(ASF)赞助的一个开源项目。它最初是Jakarta项目中的一个子项目,并在2004年3月成为ASF的顶级项目。
2、struts2:Struts 2是Struts的下一代产品,是在 struts 1和WebWork的技术基础上进行了合并的全新的Struts 2框架。
二、框架不同
1、struts1:通过采用Java Servlet/JSP技术,实现了基于Java EE Web应用的Model-View-Controller(MVC)设计模式的应用框架,是MVC经典设计模式中的一个经典产品。
2、struts2:以WebWork为核心,采用拦截器的机制来处理用户的请求,这样的设计也使得业务逻辑控制器能够与ServletAPI完全脱离开,所以Struts 2可以理解为WebWork的更新产品。
三、Action处理不同
1、struts1:Action是单实例的,一个Action的实例处理所有的请求。
2、struts2:Struts 2的Action是一个请求对应一个实例(每次请求时都新new出一个对象),没有线程安全方面的问题。
参考资料来源:百度百科-struts
参考资料来源:百度百科-Struts 2
Struts2中如何配置struts、xml?
Struts2中在配置struts、xml时,解压后找到相应途径,选择配置后一直next即可。
一、办法:
1、在官网下载最新版的Struts2.从图中可以看出,即可以分开下载,又可以一次全部下载。我选择全部下载。
2、下载后将压缩包解压到磁盘根目录。
3、进入struts-2.3.16.1文件,可以看到包含如下文件夹。
4、lib文件包含了上百个库文件,但大多数是可选的,有些库是插件,用于和其他框架的整合。
我们开发时不必全部用到这些库文件,我们可根据apps文件下的模板工程查看需要哪些jar包。进入apps文件看到struts2自带了5个工程模板。
5、此时,右侧的按钮被点亮。点击“Add External JARS?”按钮,添加用户库所需的库文件;选择添加刚才解压的struts2-blank-2.war下WEB-INF/lib中的所有jar包。
二、Struts2简介:
1、Struts2是一个基于MVC设计模式的Web应用框架,它本质上相当于一个servlet,在MVC设计模式中,Struts2作为控制器(Controller)来建立模型与视图的数据交互。Struts 2是Struts的下一代产品,是在 struts 1和WebWork的技术基础上进行了合并的全新的Struts 2框架。
2、其全新的Struts 2的体系结构与Struts 1的体系结构差别巨大。Struts 2以WebWork为核心,采用拦截器的机制来处理用户的请求,这样的设计也使得业务逻辑控制器能够与ServletAPI完全脱离开,所以Struts 2可以理解为WebWork的更新产品。
3、虽然从Struts 1到Struts 2有着太大的变化,但是相对于WebWork,Struts 2的变化很小。
三、应用流程注解:
1、当Web容器收到请求(HttpServletRequest)它将请求传递给一个标准的的过滤链包括(ActionContextCleanUp)过滤器。
2、经过Other filters(SiteMesh ,etc),需要调用FilterDispatcher核心控制器,然后它调用ActionMapper确定请求哪个Action,ActionMapper返回一个收集Action详细信息的ActionMaping对象。
3、FilterDispatcher将控制权委派给ActionProxy,ActionProxy调用配置管理器(ConfigurationManager) 从配置文件中读取配置信息(struts.xml),然后创建ActionInvocation对象。
4、ActionInvocation在调用Action之前会依次的调用所用配置拦截器(Interceptor N)一旦执行结果返回结果字符串ActionInvocation负责查找结果字符串对应的(Result)然后执行这个Result Result会调用一些模版(JSP)来呈现页面。
5、拦截器(Interceptor N)会再被执行(顺序和Action执行之前相反)最后响应(HttpServletResponse)被返回在web.xml中配置的那些过滤器和核心控制器(FilterDispatcher)。
struts2是什么?
简单的说是web开发基于MCV框架
曾经有人发明了servlet,jsp, 一群人欢欣鼓舞,开始投入jsp的怀抱, 可以慢慢的发现获取参数好麻烦,跳转个页面也难,调试也难, 最重要的随时都有乱码可能
于是有几个自认为很NB的人就搞出一个struts1, 自动封装参数, 优雅的跳转, 前后台分离,MVC概念应用, 出乎意料的火了
后来他们就有钱了, 把xwork忽悠过来一起搞出来一个struts2, 国际化啊, 低耦合啊, 各种第三方框架支持啊, 反正很臃肿后就看上去高大上了
上面说的这个很久远的故事一直发展到今天, struts2已经融入了各种培训机构, 企业单位个人都在很爽快的使用
请你谈谈对struts2的理解
这是我当初学习struts2的总结笔记Struts2
1 架构和核心技术
1·1 核心架构及控制流程
FC(Front)前端控制器,用一个过滤器写的
拦截请求;数据的初始化(ValueStack的建成,要访问的Action放在栈顶);启动控制层的调用
Valuestack
存储数据(一个专门设计的基于ognl的数据结构)
为其他组件提供数据共享的载体
Action
用于实现控制流程,本身置于ValueStack的Root栈的顶;
根据输入(用户的提交)计算输出(向用户显示的结果)
决定输出什么样的试图View
Result
把当前的ValueStack中得数据,转换为某种形式输出
Struts2提供了多种result(dispatcher,redirect,json,stream)
Interceptor
拦截Action的调用及Result的调用
可以在action调用之前,去做一些辅助性的工作;这些实现可以很方面的复用,比如说文件上传
拦截器的操作一般会涉及到ServletAPI及ValueStack
(ActionInvocation\ServletActionContext)
拦截器可以不调用后面的Action和Result,某种情况下可以决定选择Result,
(不调用invoke)由拦截器决定返回的Result
调用invokeActionOnly;只调用Action
调用invoke,就由Action决定返回的Result
控制流程
-->FC-->ValueStack,实例化Action,置于栈顶-->调用拦截器(before)-->调用Action-->调用Result
-->View输出-->调用拦截器(after)
1·2 核心技术
OGNL
一个表达式,用于实现对数据的存取(用一个字符串表达对数据的存取)是一种字符表达式规范,用于表示
对对象的属性的存取
name当前Root对象的name属性
arry[1]Root对象arry属性的第一个对象
list[2]同上
map['key']
emp.name
value>10
num1+num2
format(jireDate)调用当前栈顶的对象的方法和属性
empList.{salary}投影,取出当前对象的这个集合
#{'one':'java','two':'javajava'}
empList.{?#salary>10000}.{name}
ValueStack的基本机构
OGNL引擎
|________Root
|________Context
Action置于Root栈的栈顶
Context中的常用的key-value
request
session
application
struts2的配置文件
...
...
标记库
1">
因为struts2的Action就具备了struts1中ActionForm的功能;ActionForm的功能无非三个:初始化数据;封装数据;验证数据格式;对于struts2,都有相应的解决方式:通过Action实现Preparable接口,实现对数据初始化;Action继承ActionSupport,重写validate(),显示数据的验证,在Action中配置属性以及对应的getter和setter方法,实现数据封装。而且类型转换方面,struts2通过OGNL实现的效果要比ActionForm更灵活。
struts首先是MVC框架
MVC是一种设计模式
将应用程序分成了视图、模型、控制器三部分,使代码逻辑清晰,同时提高移植性
M与V之间--观察者模式
V与C之间--策略模式
MVC的工作流程
请求----控制器调用模型处理,返回数据-----控制器用相应的视图格式化模型返回的数据完成相应
Struts2在以上流程中解决了三个问题:
1. 控制器如何根据用户的请求决定调用哪个模型(具体是模型中的Action组件)进行处理
2. 如何在业务逻辑处理器与serv let API 分离的情况下使处理器获得请求参数,并得以执行
3. 如何将处理后返回的数据传给相应的视图生成动态网页响应给用户
结合Struts的请求流程加以说明
客户端请求----经三个过滤器(ActionContextCleanUp,其他过滤器,到FilterDispatcher核心控制器)
FilterDispatcher询问ActionMapper是否需要调用Action来处理,如果ActionMapper决定调用,FilterDispatcher就把对请求的处理交给了ActionProxy
ActionProxy通过Configuration Manager 询问框架的配置文件,找到需要调用的Action类
ActionProxy创建一个ActionInvocation实例,同时ActionInvocation通过代理模式调用Action,但在调用之前ActionInvocation会根据配置加载Action相关的拦截器,每执行完一个
拦截器,会调用invocation的invoke方法,把请求传给下个Interceptor,所有的Interceptor执行完以后,会执行Action
Action执行根据后,ActionInvocation负责根据struts.xml中的配置找到对应的返回结果
这个返回结果可能是一个 需要表示为JSP或FreeMarker的模板,或者是另一个Action链
如果是前者,表示的过程中可以使用struts2的标签,生成动态网页后返回给用户
如果是后者,则再把上述过程执行一遍
struts2 怎样读取json数据
一.认识JSON
JSON是一种轻量级、基于文本、与语言无关的数据交换格式,可以用文本格式的形式来存储或表示结构化的数据。
二.POST请求与Content-Type: application/json
常用的HTTP请求方法有GET, POST, PUT, DELETE等。在提交POST请求时,请求数据放在消息体(Body)中,请求数据的格式及编码方式用Content-Type来指定。如我们常用的表单
提交,其Content-Type默认为application/x-www-form-urlencoded,提交的数据按照key1=val1&key2=val2进行编码,服务器端也能很容易地解析K-V值。
JSON的出现,让交换的数据不再仅限于简单的K-V结构,而可以有更加复杂的层级,特别适合于RESTful接口。在发送请求时,指定Content-Type为application/json,即可使用JSON字符串作为请求的数据。而在服务器端接收到该请求后,将按照JSON字符串对请求数据进行处理。
三.Struts2接收JSON请求
在Struts2的Action中提取Content-Type为application/x-www-form-urlencoded的POST参数,我们非常熟悉:在Action中定义属性及其getter, setter方法,接收到请求时,默认会将与属性同名的参数值赋予该属性。
但是对Content-Type为application/json的请求数据,Struts2默认无法解析。因为请求的JSON数据需从输入流中读取出来,无法直接从ServletRequest的请求参数中解析。很容易想到,要读取JSON请求数据,最直接的方式就是从输入流读取。而同时,Struts2的strus2-json-plugin也提供了有关的拦截器,对JSON请求数据进行解析。下面将对两种方案进行分析:
1.从输入流中读取JSON请求数据,以下是在Action中实现的一个读取输入流数据的方法
1 //解析请求的Json数据 2 private String getRequestPostData(HttpServletRequest request) throws IOException { 3 int contentLength = request.getContentLength(); 4 if(contentLength<0){ 5 return null; 6 } 7 byte buffer[] = new byte[contentLength]; 8 for (int i = 0; i < contentLength;) { 9 int len = request.getInputStream().read(buffer, i, contentLength - i);10 if (len == -1) {11 break;12 }13 i += len;14 }15 return new String(buffer, "utf-8");16 }
在Action的execute方法中调用该方法,即可获取到请求的JSON数据。
2.使用struts2-json-plugin配置
添加struts2-json-plugin的依赖,以maven配置为例:
...
org.apache.struts
struts2-json-plugin
STRUTS_VERSION
...
struts.xml配置文件添加JSON配置(粗体部分)
...
...
在Action中指定JSON数据中各个key及getter, setter,如请求的JSON数据如下,则在Action中定义名为type, message, code的属性及其getter, setter
{ "type":10, "message": "this is a test msg", "code": 200}这样,在接收到以上JSON请求数据时,Struts会默认将type, message, code的值解析出来。
3.struts2-json-plugin解析JSON请求数据的分析
经过分析,struts2-json-plugin解析JSON请求数据,最核心的一个类是JSONIntercepter类。该拦截器的主要工作就是:读取JSON请求数据,将JSON数据提取出K-V值并设置到Action的属性中。步骤如下:
判断当前请求数据类型是否为JSON类型
1 String contentType = request.getHeader("content-type");2 ...3 if ((contentType != null) && contentType.equalsIgnoreCase("application/json")) {4 // load JSON object5 Object obj = JSONUtil.deserialize(request.getReader());6 ...7 }
如果数据类型为JSON,从输入流中读取JSON数据,以下为JSONUtil类的deserialize方法
1 public static Object deserialize(Reader reader) throws JSONException { 2 // read content 3 BufferedReader bufferReader = new BufferedReader(reader); 4 String line; 5 StringBuilder buffer = new StringBuilder(); 6 7 try { 8 while ((line = bufferReader.readLine()) != null) { 9 buffer.append(line);10 }11 } catch (IOException e) {12 throw new JSONException(e);13 }14 15 return deserialize(buffer.toString());16 }
解析得到JSON对象后,遍历JSON对象,取出K-V,通过反射的V设置给予K相同的属性
开发者可根据自己的需求进行选择:从输入流直接读取JSON请求数据,或使用struts2-json-plugin对JSON请求数据进行处理。
struts和struts2的区别
Struts2是基于WebWork的一个全新框架.
我以前就是学Struts1.4学了一个多月,好不容易有进展了,却被告知现在流行用Struts2.
不过有了Struts1的基础,学Struts2更方便.
Struts2主要改进是取代了Struts1的Servlet和Action.
Struts2的核心框架是当作一个filter来实现其功能的,而Struts1是ActionServlet.
然后在Action上,Struts1都少不了要传递Request等参数,还要继承Action父类,而Struts2只要实现了一个public String execute()就可以了,这样Action就可以实现脱离Servlet 测试.
Struts2还提供了拦截器(Interceptot)等Struts1所没有的技术.
这一点到网上搜搜有很多文献.
一个简单的配置文件:struts.xml(取代了struts1里面的strut-config.xml)
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
login_success.jsp
login.jsp