struts2学习笔记摘要一

来源:互联网 发布:腾讯软件中心官方网站 编辑:程序博客网 时间:2024/05/21 03:27
1.model2开发模式
    model1:使用JSP页面和JavaBean相结合的方式,通过JSP来接受客户端请求,用JavaBean或其他服务完成业务逻辑、数据库操作和返回页面。主要架构简单,适合小型项目的开发。但是JSP职责不单一,职责过重,不便于维护。
    Model2:是建立在MVC设计模式基础上。实现MVC模式的应用程序由三大部分构成:模型、视图和控制器。视图部分负责实现应用程序的信息显示功能;模型部分封装着应用程序的数据和业务逻辑;控制器部分负责接收来自用户的输入并控制模型和视图部分做相应的变化。

    struts1使用servlet控制器,struts2使用过滤器。

    

    对于model2模式还可以进一步解耦,将模型部分业务逻辑可以分为业务逻辑和持久化逻辑两层。
2.部署文件

    对于servlet作为控制器,你需要防止用户通过他们的浏览器直接访问有关的JSP页面有好几种方法做到。比如:1.把JSP页面放在WEB-INF子目录下。存放在WEB-INF子目录或它的某个下级子目录里的任何东西都受到了保护。如果你把你的JSP页面放在WEB-INF子目录下,就不能使用一个浏览器去访问他们,但控制器仍可以把外来的请求转发到那些JSP页面去。不过,这并不是一个值得推荐的办法,因为并非所有的容器都具备这种保护机制,例如,bea公司推出的Weblogic就做不到这一点。2.使用一个servlet过滤器来过滤对JSP页面的请求。3.在你的部署描述文件里使用安全限制,这比使用一个过滤器要容易,因为你不必编写一个过滤器类。

3.过滤器的生命周期
   init:过滤器一旦开始运行,WEB容器就调用这个方法进行必要的初始化。在过滤器的一个生命周期里,这个方法只被调用一次。
   doFilter:在过滤器开始运行之后,Web容器每接收到一个与该过滤器的URL模式相匹配的URL就会调用这个方法。
   destroy:在过滤器即将推出运行的时候,web容器将调用这个方法。
4.初识struts
  一个struts的程序都包含一个struts.xml和struts.properties文件。struts.xml文件相对而言更重要一些,因为它是我们对struts应用程序里的各种动作进行配置的地方。struts.properties文件是可选的,因为struts框架中有一个默认的default.properties文件,该文件的内容是一些适用于绝大多数应用程序的标准化设置。 使用struts的第一个好处是我们不必非得编写一个控制器不可,这使我们可以把注意力集中在编写各种动作类的业务逻辑方面。
  struts为了加快开发工作的速度而具备的一些功能:
  struts提供一个过滤器调度程序,程序员不必再自行编写一个。
  struts使用了一个基于xml的配置文件来匹配URI和动作。因为xml文档都是文本文件,所以对应用程序的许多改动都用不着再重新编译有关代码即可生效。
  对动作类进行实例化和提取用户输入去填充各有关动作属性的工作都由struts负责。如果程序员没有指定一个动作类,struts将对一个默认的动作类进行实例化。 struts可以对用户输入做一些基本的合法性验证。 struts负责调用动作方法,而程序员可以通过配置文件轻而易举地改变某个动作的方法。 struts负责检查各个动作的结果和执行该结果。最常见的结果类型是Dispatcher,其含义是把控制权交个一个JSP页面。
  4.1对于Velocity和FreeMarker
   这两种技术相对于JSP而言也是一种视图模板语言。Velocity和FreeMarker模板可以被打包在一个Jar文件里,而这正是许多struts插件的发行和传播办法。你无法使用一个JAR文件里,而这正是许多struts插件的发行和传播办法,你无法使用一个JAR文件来传播JSP页面,至少那样做不容易。FreeMarker比Velocity更先进一些。
  4.2开发小特性
   struts会在启动时读取struts.xml文件。在开发模式下,struts在处理每一个请求时都会去检查一遍这个文件的时间戳,只要这个文件的时间戳从它最后一次被加载以来发生了变化,struts就会重新加载这个文件,因此,如果你在开发模式下修改了struts.xml文件,你用不着重新启动你的web容器。 在使用拦截器之前,必须先注册拦截器。让struts应用程序不带任何配置文件是可以做到的,零配置功能就是为此而准备的。
  4.3include元素
   一个大的应用程序可能有许多个包。为了让大型应用程序的struts.xml文件更易于管理,我们可以把它划分成几个较小的文件——最好是让每个小文件只包含一个包或只包含几个彼此相关的包——然后用include元素来引用这些小文件。<include file="">。 如果某个方法返回了一个值而这个值没有与之匹配的result元素,struts将尝试在global-results元素下,为它寻找一个匹配的结果,如果在global-results元素下也没有找到适当的result元素,struts将抛出一个异常。global-results必须放在包下。
   4.4param元素
      param元素把一个值传递给指定的参数。<param name="property">value</param>
   4.5constant元素
     除了struts.xml文件,你还可以有一个struts.properties文件。在创建一个struts.properties文件最常见的理由是你想覆盖在default.properties文件中定义的一组或多组健/值对。不过需要创建这个文件的场合并不多,默认的default.properties文件已经可以满足绝大数的情况。
  4.6struts.properties文件
    创建一个struts.properties文件目的就是想覆盖default.properties文件中的一个或多个设置项。
    在开发过程中,你可以在包元素的开头部分加上两个
    <constant name="struts.enable.DynamicMethodInvoction" vlaue="false"/>
    <constant name="struts.devMode" value="true">
   第一个constant将禁用动态方法调用功能。第二个constant元素将导致struts切换到开发模式。
   4.7依赖注入
   依赖注入是一种流行的设计模式,它在struts里得到了广泛的应用,人们也称之为控制反转。依赖注入其实也很简单,如果有两个东西,其中一个东西需要用到另一个东西,就称之为依赖。通过构造器来注入依赖关系并不是依赖注入的唯一方式。依赖关系还可以通过一个setter方法来注入。struts使用setter方法作为它的依赖注入策略。
  5动作与结果
   struts提供的拦截器和其他组件解决了Web应用程序开发工作中的常见问题,程序员就可以把注意力集中到编写动作类里的业务逻辑上去。
   5.1动作类
   应用程序可以完成的每一个操作都可以称之为一个动作。动作类其实是一些简单的普通java类。必须遵守一定的规则。 每一个属性都必须要有一个get和一个set方法。动作类中必须有一个不带参数的构造器。 每一个动作类必须要有一个在struts执行这个动作时调用的方法。 struts2会为每个http请求创建一个新的动作实例,而struts1不是这样的,所以我们在编写一个动作类的时候不必考虑线程安全问题。在默认情况下,struts2不会创建一个HttpSession对象,而struts1不是的。不过JSP仍然会这样做,如果你想一个与会话完全无关的动作,就必须在所有的JSP页面的开头加上以下代码:<%@page session="false">
    绝大多数的动作类都会扩展自一个ActionSupport的基类,并因此实现com.opensymphony.xwork.Action借口。同时你就会继承下面五个属性字段:
   success:表示动作执行成功并应该把结果视图显示给用户。
   none:表示动作执行成功但不应该把任何结果视图显示给用户。
   error:表示动作执行不成功并因该把一个报错视图显示给用户。
   input:表示输入验证失败并因该把刚才用来获取用户输入的那个表单重新显示给用户。
   Login:表示动作没有执行,并因该把登录视图显示给用户。
   关于struts动作有一个优点,你不必考虑视图如何去访问它。在其它程序为了视图能够访问某个值,我们不得不把它保存到一个作用域内属性里。struts会自动地把动作和其他对象压入Vlaue Stack栈,而这个栈对视图而言是可访问的
   5.2如何访问资源
   在动作类里,可以通过servletActionContext对象或通过实现Aware接口去访问Servlet-Context、HttpSession、HttpServletRequest和HttpServletResponse等资源。实现Aware接口是依赖注入技术的一种实现。
   5.2.1ServletActionContext对象
   有两个类可以用来访问刚才提到的那些资源:com.opensyphony.xwork2.ActionContext  和org.apache.struts2.ServletActionContext。后者包含前者,并且比前者更容易使用。不应该从动作类的构造器里调用ServletActionContext类的方法,因为在这个阶段,底层的ActionContext对象还没有被传递给它。从某个动作的构造器里调用
ServletActionContext.getServletContext方法将返回空值。
   5.2.2Aware接口
   Struts提供了4钟分别用来访问servletContext、HttpServletRequest、HttpServlet-Response和HttpSession对象的接口。ServletContextAware接口、ServletRequestAware接口、ServletReponseAware接口、SessionAware接口。其中SessionAware接口并不能将当前的HttpSession实例提供给你,你得到的是一个Java.util.Map。
   5.3把静态参数传递给一个动作
      param元素实现。
   5.4ActionSupport类
     ActionSupport类进行扩展有助于编写动作类
   5.5结果
     每个动作方法都将返回一个String类型的值。
     name代表结果的名字。默认值为"success"
     type表示结果的类型。默认值为“dispatcher”
     5.5.1Chain
       Chain结果类型的基本用途是构成一条动作链:前一个动作把控制权转交给后一个动作,而前一个动作的状态在后一个动作里仍然保持着。动作链由Chaining拦截器负责处理。建议不要使用。
     5.5.2Dispatcher
      Dispatcher结果类型是最常用的结果类型,也是Struts框架的默认结果类型。这个结果类型有location参数,它是一个默认的参数,因为它是默认参数,所以你也可以这样使用它:<result name="">
         <param name="location">resource</param>
    </result>
     5.5.3FreeMarker
      这种结果类型将把控制权转交给一个FreeMarker模板
     5.5.4HttpHeader
      这种结果类型用来把一个HTTP状态发送到浏览器
     5.5.5Redirect
      这种结果类型将把用户重定向到另一个资源,而不是把控制权转交给该资源。
      location:用来给出重定向的目的地
      parse:用来表明是否要把location参数的值视为一个OGNL表达式来解释。parse参数的默认值为true.
      使用重定向而不是转交控制权的主要理由是为了把用户定向到一个外部资源。在需要把用户定向到一个内部资源的时候,使用Dispatcher结果类型的做法更好,应为这样做速度会更快一些。重定向需要多兜一个圈子,客户端的浏览器将不得不重新发送一个新的HTTP请求。偶尔也会遇到一些重定向到一个内部资源的情况。假使你不想让用户刷新浏览器画面的操作再次触发刚才触发过的动作,就应该使用重定向。因为重定向目的地是一个新的UTL地址。这个并关心目的地是JSP还是action动作。
    5.5.6Redirect Action
    不是重定向到另一资源,而是重定向到另一个动作。有如下参数:
     actionName:用来指定目的地动作的名字。
     namespace:用来指定目的地动作的命名空间
   5.5.7Stream
     这种结果类型不会把控制权转交给一个JSP页面,它将向浏览器发送一个输出流。
   5.5.8Velocity
   这种结果将把控制权交给一个Velocity模板。
   5.5.9XSLT
   这种结果类型使用XML/XSLT作为视图技术。
   5.5.10PlainText
   通常用来发送JSP源代码
   5.6异常处理:exception-mapping元素
     <action name="" class="">
          <exception-mapping exception="java.lang.Exception" result="error">
          <result name="error">/jsp</result>
     </action>
   5.7通配符映射
     Struts找到的带有通配符的匹配不止一个,它最后找到的那个匹配将胜出

     没有使用通配符的优于使用统配符的

     统配符匹配的URI字符串可以用{1}来引用。{0}包含整个URI

     *可以匹配零个或多个字符,但不包括斜线(/)字符,如果想把斜线字符也包括在内需要使用**。对某个字符进行转义请使用反斜杠(\)。
   5.8动态方法调用
    !字符,尽量不要使用。
0 0