struts2.X心得3--struts2入门知识2

来源:互联网 发布:python split函数 编辑:程序博客网 时间:2024/06/12 21:14

1. MVC与servlet

Servlet的优点

是mvc的基础,其他的框架比如struts1,struts2,webwork都是从servlet基础上发展过来的。所以掌握servlet是掌握mvc的关键。Servlet把最底层的api暴漏给程序员,使程序员更能清楚的了解mvc的各个特点。程序员可以对servlet进行封装。Struts2就是从servlet中封装以后得到的结果。

Servlet的缺点

每写一个servlet在web.xml中都要做相应的配置。如果有多很servlet,会导致web.xml内容过于繁多。这样的结构不利于分组开发。在servlet中,doGet方法和doPost方法有HttpServletRequest和HttpServletResponse参数。这两个参数与容器相关,如果想在servlet中作单元测试,则必须初始化这两个参数。如果一个servlet中有很多个方法,则必须采用传递参数的形式,分解到每一个方法中。

重构servlet

针对servlet以上的特点,我们可以对servlet进行重构,使其开发起来更简单。更容易,更适合团队协作。

重构的目标:

1)、 只写一个serlvet或者过滤器,我们这里选择过滤器。

2)、 不用再写任何的servlet,这样在web.xml中写的代码就很少了。

3)、 原来需要写serlvet,现在改写action

4)、 在action中把HttpServletRequest参数和HttpServletResponse参数传递过去。

5)、 在过滤器中通过java的反射机制调用action

3  Struts2介绍

1)、 struts2是apache组织发明的开源框架。是struts的第二代产品。

2)、 struts2是在struts和webwork基础上整合的全新的框架。

3)、 struts2的配置文件组织更合理,是企业开发很好的选择。

4)、 struts2的拦截器为mvc框架注入了全新的概念。


4.过滤器与拦截器的区别:

*相同点:都是起拦截作用

*不同点:

      *作用范围

过滤器:使用范围是J2EE范畴,任何一个web工程都可以使用过滤器;

拦截器:使用范围是struts2范畴,离不开struts2框架的

    *完成的功能:

过滤器:拦截请求资源;拦截器:完成其他所有功能

*执行顺序:

过滤器——>拦截器

5.加载struts.xml过程

说明:

1)、 在启动的时候加载了三个配置文件

struts-default.xml、struts-plugin.xml、struts.xml

2)、 如果这三个文件有相同的项,后面覆盖前面的。

3)、 struts.xml文件必须放在src下才能找到

6.在struts.xml中引入其他配置文件

<includefile="csdn/action/include/struts-include.xml">

</include>

这样在加载struts.xml文件的时候,struts-include.xml文件也能被加载进来。

7.Action中result的各种转发类型

result配置类似于struts1中的forward,但struts2中提供了多种结果类型,常用的类型有: dispatcher(默认值)、redirect 、 redirectAction 、plainText。

1)、  每个action方法都返回一个String类型的值,struts一次请求返回什么值是由这个值确定的。

2)、  在配置文件中,每一个action元素的配置都必须有result元素,每一个result对应一个action的返回值。

3)、  Result有两个属性:

name:结果的名字,和action中的返回值一样,默认值为success;

type:响应结果类型,默认值为dispatcher.

4)、可以看出result及结果集总共10种类型;默认类型为ServletDispatcherResult即转发;结果类型可以是这10种结果类型的任意一种。

A、Dispatcher在配置文件中,可以有两种写法:

第一种写法:

       <resultname="success">/resulttype/successDispatcher.jsp</result>

第二种写法:

       <resultname="success">

              <paramname="location">/resulttype/successDispatcher.jsp</param>

</result>

B、Redirect属于重定向。如果用redirect类型,则在reuqest作用域的值不能传递到前台.

C、redirectAction类型

(1)、说明

把结果类型重新定向到action

可以接受两种参数

a)      actionName: action的名字

b)      namespace:命名空间

(2)、 例子

第一种方式:

<result name="success" type="redirectAction">resulttype/redirectactionAction.action</result>

 

第二种方式:

<result name="success" type="redirectAction">

       <!--

              actionName:

                     请求的action的路径

              namespace:

                     如果不写,默认就是请求的action的路径,如果写,路径将被重新赋值

       -->

       <param name="actionName">

              resulttype/redirectactionAction.action

       </param>

</result>

  

 

 

 

 

 

 


下面是redirectAction 结果类型的例子,如果重定向的action

中同一个包下:

<resulttype="redirectAction">helloworld</result>

如果重定向的action在别的命名空间下:

<resulttype="redirectAction">

   <paramname="actionName">helloworld</param>

   <param name="namespace">/test</param>

</result>

plaintext:显示原始文件内容,例如:当我们需要原样显示jsp文件源代码的时候,我们可以使用此类型。

<resultname="source" type="plainText ">

   <paramname="location">/xxx.jsp</param>

   <paramname="charSet">UTF-8</param><!-- 指定读取文件的编码 -->

</result>

在result中还可以使用${属性名}表达式访问action中的属性,表达式里的属性名对应action中的属性。如下:

<resulttype="redirect">view.jsp?id=${id}</result>

8.多个Action共享一个视图--全局result配置

当多个action中都使用到了相同视图,这时我们应该把result定义为全局视图。struts1中提供了全局forward,struts2中也提供了相似功能:

<package....>

   <global-results>

      <result name="message">/message.jsp</result>

   </global-results>

</package>

9.为Action的属性注入值

Struts2为Action中的属性提供了依赖注入功能,在struts2的配置文件中,我们可以很方便地为Action中的属性注入值。注意:属性必须提供setter方法。

publicclass HelloWorldAction{

   private String savePath;

   public String getSavePath() {

      return savePath;

   }

   public void setSavePath(String savePath) {

      this.savePath = savePath;

   }

       ......

}

<packagename="csdn" namespace="/test"extends="struts-default">

   <action name="helloworld"class="cn.csdn.action.HelloWorldAction" >

      <param name="savePath">/images</param>

      <resultname="success">/WEB-INF/page/hello.jsp</result>

   </action>

</package>

上面通过<param>节点为action的savePath属性注入“/images”

依赖注入:控制反转IOC 就是本身不负责依赖对象的创建和维护,依赖对象的创建及维护是由外部容器负责的。控制的方向就转移到了外部容器,控制权的转移就是所谓的反转。在运行期间由外部容器动态将依赖对象注入到组件中。

很多的注入方式:比如set方法注入

10、Action原型模式

1)、 回顾servlet

在servlet中,一个servlet只有一个对象,也就是说servlet是单例模式single。如果把一个集合写在servlet属性中,则要考虑线程安全的问题。

2)、 Action多例模式

但是在struts2的框架中,并不存在这种情况,也就是说struts2中的action,只要访问一次就要实例化一个对象。这样就不存在线程安全的问题。这也是struts2框架的一个好

原创粉丝点击