Struts2课件.docx
- 文档编号:7495398
- 上传时间:2023-05-11
- 格式:DOCX
- 页数:20
- 大小:142.29KB
Struts2课件.docx
《Struts2课件.docx》由会员分享,可在线阅读,更多相关《Struts2课件.docx(20页珍藏版)》请在冰点文库上搜索。
Struts2课件
Sturuts2
第一节、Struts2介绍
Struts2是Struts的下一代产品,是在struts1和WebWork的技术基础上进行了合并的全新的Struts2框架。
其全新的Struts2的体系结构与Struts1的体系结构差别巨大。
Struts2以WebWork为核心,采用拦截器的机制来处理用户的请求,这样的设计也使得业务逻辑控制器能够与ServletAPI完全脱离开,所以Struts2可以理解为WebWork的更新产品。
虽然从Struts1到Struts2有着太大的变化,但是相对于WebWork,Struts2的变化很小。
Struts2对Struts1进行了巨大的改进。
主要表现在如下几个方面:
在Action的实现方面:
Struts1要求必须统一扩展自Action类,而Struts2中可以是一个POJO。
线程模型方面:
Struts1的Action是单实例的,一个Action的实例处理所有的请求。
Struts2的Action是一个请求对应一个实例(每次请求时都新new出一个对象),没有线程安全方面的问题。
Servlet依赖方面:
Struts1的Action依赖于ServletAPI,比如Action的execute方法的参数就包括request和response对象。
这使程序难于测试。
Struts2中的Action不再依赖于ServletAPI,有利于测试,并且实现TDD。
封装请求参数:
Struts1中强制使用ActionForm对象封装请求的参数。
Struts2可以选择使用POJO类来封装请求的参数,或者直接使用Action的属性。
表达式语言方面:
Struts1中整合了EL,但是EL对集合和索引的支持不强,Struts2整合了OGNL(ObjectGraphNavigationLanguage)。
绑定值到视图技术:
Struts1使用标准的JSP,Struts2使用"ValueStack"技术。
类型转换:
Struts1中的ActionForm基本使用String类型的属性。
Struts2中使用OGNL进行转换,可以更方便的使用。
Struts1中支持覆盖validate方法或者使用Validator框架。
Struts2支持重写validate方法或者使用XWork的验证框架。
Action执行控制的对比:
Struts1支持每一个模块对应一个请求处理,但是模块中的所有Action必须共享相同的生命周期。
Struts2支持通过拦截器堆栈为每一个Action创建不同的生命周期。
概括:
1、struts2是java官方出的mvc设计模式的框架
2、mvc是什么?
mvc是一种设计思想,将项目分为模型(model)-视图(view)-控制器(controller)
在mvc设计思想下有很多有很多实现的框架,struts2就是一种而已
3、struts1和struts2的区别
struts2是在struts1和webwork基础上整合过来的
struts1的action是单例模式,线程不安全
struts2的action是原型模式,线程安全
第二节、搭建struts2的开发环境
1,导包解压struts-2.3.16.3-all.zip文件
2,找struts-2.3.16.3-all\struts-2.3.16.3\apps\struts2-blank\WEB-INF
\lib下的所有包。
struts2-core-2.3.16.3.jarstruts2框架的核心类库
xwork-core-2.3.16.3.jarXWork类库,struts2在其上构建
ognl-3.0.6.jar对象图像导航语言(ObjectGraphNavigationLanguage),struts2框架通过其读写对象属性
freemarker-2.3.19.jarstruts2的UI标签的模版使用FreeMarker编写
commons-logging-1.1.3.jarASF出品的日志包,struts2框架使用此日志包支持log4J和JDK1.4+的日志记录
commons-fileupload-1.3.1.jar文件上传主键2.1.6版本后必须加入此文件
3,在web.xml中配置struts2的核心功能过滤器
StrutsPrepareAndExecuteFilter
注:
StrutsPrepareAndExecuteFilter的inti()方法中将会读取类路径下默认的配置文件struts.xml完成初始化操作。
自struts2.1.3以后org.apache.struts2.dispatcher.FilterDispatcher已经标准为过时.
位置:
struts-2.3.16.3-all\struts-2.3.16.3\apps\struts2-blank\WEB-INF\web.xml
4,在src下配置struts2的配置文件
在下可直接找struts-2.3.16.3-all\struts-2.3.16.3\apps\struts2-blank\WEB-INF\classes\
struts.xml文件
2)编写struts2的配置文件在src下
-- include节点是struts2中组件化的方式 可以将每个功能模块独立到一个xml配置文件中 然后用include节点引用 -->
-- package提供了将多个Action组织为一个模块的方式, package的名字必须是唯一的 package可以扩展 当一个package扩展自, 另一个package时该package会在本身配置的基础上加入扩展的package的配置 父package必须在子package前配置
name:
package名称
extends:
继承的父package名称
abstract:
设置package的属性为抽象的 抽象的package不能定义action 值true:
false
namespace:
定义package命名空间 该命名空间影响到url的地址,例如此命名空间为/test那么访问是的地址为http:
//localhost:
8080/struts2/test/XX.action -->
-- Action配置 一个Action可以被多次映射(只要action配置中的name不同)
name:
action名称 class:
对应的类的路径 method:
调用Action中的方法名-->
-- 节点配置name :
result名称 和Action中返回的值相同, type :
result类型 不写则选用superpackage的type struts-default.xml中的默认为dispatcher(转发)-->
-- 引用拦截器name:
拦截器名称或拦截器栈名称-->
-- 参数设置 name:
对应Action中的get/set方法 -->
-- 定义拦截器 name:
拦截器名称 class:
拦截器类路径 -->
-- 定义拦截器栈 -->
-- 定义默认的拦截器 每个Action都会自动引用 如果Action中引用了其它的拦截器 默认的拦截器将无效 -->
-- 全局results配置 -->
注:
struts2的配置文件格式所在地址是:
struts-2.3.16.3-all\struts-2.3.16.3\apps\
struts2-blank\WEB-INF\classes\struts.xml
name="包的名字"namespace="命名空间是action路径的一部分"都要继承struts-default因为struts2的很多功能都是拦截器实现的每次会自动加载struts-default.xml
extends="struts-default"> 自定义的方法规则 1,继承ActionSupport 2,方法是public且反返回值是String 5,访问 http: //localhost: 8080/项目名/命名空间名/action的name名字.action 第三节、乱码 1)当输入的值有中文时把提交方式改成post-->在stryts2-core-2.3.16.3.jar中static的default/properties是utf-8 2)配置过滤器文件: publicclassChineseCodeFilterimplementsFilter{ privateStringcoder="utf-8"; publicvoiddestroy(){ } publicvoiddoFilter(ServletRequestservletRequest,ServletResponseservletResponse, FilterChainchain)throwsIOException,ServletException{ /*设置响应的格式*/ servletResponse.setContentType("text/html;charset="+coder); /*向下强转*/ HttpServletRequesthsr=(HttpServletRequest)servletRequest; /*获取请求: POSTGET*/ Stringmethod=hsr.getMethod(); /*根据请求作出处理*/ if("get".equalsIgnoreCase(method)){ /*装饰设计模式*/ HttpServletRequestWrapperhsrw=newHttpServletRequestWrapper(hsr){ /*重写getParameterMap方法,因为struts2获取参数的时候,调用的就是这个方法*/ publicMapgetParameterMap(){ /*获取传递过来的参数值,键是字符串,值是字符串数组类型*/ Map /*建立新的map集合*/ Map /*遍历*/ for(Map.Entry map.entrySet()){ /*获取键*/ Stringkey=entry.getKey(); /*获取值*/ String[]values=entry.getValue(); /*因为值里可能有乱码,所以要修改*/ String[]newValues=newString[values.length]; /*遍历*/ for(inti=0;i try{ /*将旧的值重新解码,编码*/ newValues[i]=newString(values[i].getBytes("ISO-8859-1"),coder); }catch(Exceptione){ e.printStackTrace(); thrownewRuntimeException(e); } } /*将旧的键,新的值加入map集合*/ newMap.put(key,newValues); } returnnewMap; } /*如果是servlet解决乱码,重写这个方法即可*/ /*publicStringgetParameter(Stringname){ Stringvalue=super.getParameter(name); try{ value=newString(value.getBytes("ISO-8859-1"),coder); }catch(Exceptione){ e.printStackTrace(); thrownewRuntimeException(e); } returnvalue; }*/ }; /*放行*/ chain.doFilter(hsrw,servletResponse); }else{ /*处理post请求乱码问题*/ servletRequest.setCharacterEncoding(coder); /*放行*/ chain.doFilter(servletRequest,servletResponse); } } publicvoidinit(FilterConfigconfig)throwsServletException{ Stringcoder=config.getInitParameter("coder"); if(coder! =null){ this.coder=coder; } } } 第四节、转发和重定向 1、转发到某一个网站dispacher 2、重定向到某一个网站redirect 3、转发到某一个actionchain 4、重定向到某一个actionredirectaction 转发和重定向的区别: 1)、转发的时候,共享上一次的action,重定向不会 2)、转发的时候,显示的是上一次的url,重定向的显示的是下一次的url 我们先来说一下值栈的概念: 值栈是Struts2中的一个重要概念,几乎所有的Struts2操作都要同值栈打交道,Struts2中的值栈其实是一个存放对象的堆栈.对象以Map的形式存储在该堆栈中.并且这个堆栈中对象属性的数值可以通过OGNL表达式或者EL表达式获得. 堆栈的概念: 栈(stack)又名堆栈,它是一种运算受限的线性表。 其限制是仅允许在表的一端进行插入和删除运算。 这一端被称为栈顶,相对地,把另一端称为栈底。 向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。 当每个Action请求到来的时候,容器都会先创建一个此Action的对象并存入值栈,该对象携带与Action执行过程有关的信息. <%@taglibprefix="s"uri="/struts-tags"%> debug/> 转发或重定向到某一个页面 class=".bochy.action.UserAction" method="a"> class=".bochy.action.UserAction" method="b"> 转发或重定向到某一个action chain: 称为Action链,当一个Action执行完成后需要跳转到另一个Action,此时就要用到Action链.通过Action链的使用,可以轻松的实现两个Action之间的数据共享.在Struts2中,Action链是通过一个叫做”chain”的拦截器实现的.(在struts-default.xml中可以查看). 那么如何保证Action链中的Action可以共享数据呢? ? ? 其原因是处于一个Action链中的所有Action都共享一个值栈,当Action1执行时,会将自身相关信息压入值栈.当Action2执行时也会将自身相关信息压入值栈,如果Action2执行过程中需要Action1中的数据,则到值栈中获取即可.这样就达到了数据共享的目的. chain: 转发到某一个Action 转发: class=".bochy.action.UserAction" method="c"> --转发到下一个action(同一个namespace下即同包下)--> class=".bochy.action.UserAction" method="d"> --转发到下一个action(不同的namespace)--> 重定向 class=".bochy.action.UserAction" method="e"> --重定向到下一个action(同一个namespace下)--> class=".bochy.action.UserAction" method="f"> --重定向到下一个action(不同的namespace)--> servlet与action的区别 servlet只会被初始化一次,多个线程共享一个servlet实例,所以线程不安全. 也就是这样理解: 在项目中servlet只有对应的一个对象.是单例模式. 一般在servlet不定义成员变量,在方法里操作 action的每次请求都是一个新的对象,线程安全的. 是多例模式.
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Struts2 课件