Struts2课件.docx

上传人:b****5 文档编号:7495398 上传时间:2023-05-11 格式:DOCX 页数:20 大小:142.29KB
下载 相关 举报
Struts2课件.docx_第1页
第1页 / 共20页
Struts2课件.docx_第2页
第2页 / 共20页
Struts2课件.docx_第3页
第3页 / 共20页
Struts2课件.docx_第4页
第4页 / 共20页
Struts2课件.docx_第5页
第5页 / 共20页
Struts2课件.docx_第6页
第6页 / 共20页
Struts2课件.docx_第7页
第7页 / 共20页
Struts2课件.docx_第8页
第8页 / 共20页
Struts2课件.docx_第9页
第9页 / 共20页
Struts2课件.docx_第10页
第10页 / 共20页
Struts2课件.docx_第11页
第11页 / 共20页
Struts2课件.docx_第12页
第12页 / 共20页
Struts2课件.docx_第13页
第13页 / 共20页
Struts2课件.docx_第14页
第14页 / 共20页
Struts2课件.docx_第15页
第15页 / 共20页
Struts2课件.docx_第16页
第16页 / 共20页
Struts2课件.docx_第17页
第17页 / 共20页
Struts2课件.docx_第18页
第18页 / 共20页
Struts2课件.docx_第19页
第19页 / 共20页
Struts2课件.docx_第20页
第20页 / 共20页
亲,该文档总共20页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

Struts2课件.docx

《Struts2课件.docx》由会员分享,可在线阅读,更多相关《Struts2课件.docx(20页珍藏版)》请在冰点文库上搜索。

Struts2课件.docx

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的核心功能过滤器

struts2Filter

org.apache.struts2.dispatcher.ng.filter.

StrutsPrepareAndExecuteFilter

struts2Filter

/*

注:

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(转发)-->

         /talk.jsp

 

-- 引用拦截器name:

拦截器名称或拦截器栈名称-->

            

         

-- 参数设置 name:

对应Action中的get/set方法 -->

         

        

 

            

-- 定义拦截器   name:

拦截器名称 class:

拦截器类路径 -->

            

            

            

-- 定义拦截器栈 -->

            

                

                

            

        

        

-- 定义默认的拦截器 每个Action都会自动引用 如果Action中引用了其它的拦截器 默认的拦截器将无效 -->

        

        

-- 全局results配置 -->

        

            /error.jsp

        

注:

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">

/hello.jsp

/index.jsp

 

自定义的方法规则

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(){

/*获取传递过来的参数值,键是字符串,值是字符串数组类型*/

Mapmap=super.getParameterMap();

/*建立新的map集合*/

MapnewMap=newHashMap();

/*遍历*/

for(Map.Entryentry:

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">

/a.jsp

class=".bochy.action.UserAction"

method="b">

/b.jsp

转发或重定向到某一个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下即同包下)-->

b

class=".bochy.action.UserAction"

method="d">

--转发到下一个action(不同的namespace)-->

/bchy/admin

b

重定向

class=".bochy.action.UserAction"

method="e">

--重定向到下一个action(同一个namespace下)-->

b

class=".bochy.action.UserAction"

method="f">

--重定向到下一个action(不同的namespace)-->

/

c

servlet与action的区别

servlet只会被初始化一次,多个线程共享一个servlet实例,所以线程不安全.

也就是这样理解:

在项目中servlet只有对应的一个对象.是单例模式.

一般在servlet不定义成员变量,在方法里操作

action的每次请求都是一个新的对象,线程安全的.

是多例模式.

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 幼儿教育 > 幼儿读物

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2