Struts2的学习笔记-基础篇

2017-09-12  本文已影响0人  ElliottSheng

一、Struts2概述

Struts2是一个基于MVC设计模式的Web应用框架,它本质上相当于一个servlet,在MVC设计模式中,Struts2作为控制器(Controller)来建立模型与视图的数据交互。Struts 2是Struts的下一代产品,是在 struts 1和WebWork的技术基础上进行了合并的全新的Struts 2框架。

二、Struts2主要功能

1.允许POJO(Plain Old Java Objects)对象 作为Action,
2.Action的execute 方法不再与Servlet API耦合,
3.更易测试,支持更多视图技术(JSP、FreeMarker、Velocity),
4.基于Spring AOP思想的拦截器机制,更易扩展,
5.更强大、更易用输入校验功能
6.整合Ajax支持

三、Struts2的下载与安装

http://struts.apache.org/download.cgi 去下载Struts2 最新版
struts2目录结构
apps 该文件夹包含了基于struts2 的示例应用,这些示例应用对于学习者是非常有用的
docs 该文件夹下包含了struts2 相关文档,包括struts2 快速入门、struts2的文档以及API文档等
lib 该文件夹下包含了Struts2框架和核心类库,以及struts2第三方插件类库
src 该文件夹下包含了Struts2框架的全部源代码
开发时没必要将lib目录下jar文件全部复制到项目中

三、Struts2的的执行流程

简单执行流程

四、Struts2的HelloWorld

1.创建WEB工程

使用IDEA创建Struts2工程,自动会下载导入对应的jar包

asm-3.3.jar 【操作java字节码的类库】
asm-commons-3.3.jar 【提供了基于事件的表现形式】
asm-tree-3.3.jar 【提供了基于对象的表现形式】
commons-fileupload-1.2.2.jar 【文件上传相关包】
commons-io-2.0.1.jar 【流相关包】
commons-lang3-3.1.jar 【struts对java.lang包的扩展】
freemarker-2.3.19.jar 【struts的标签模板库jar文件】
javassist-3.11.0.GA.jar 【struts对字节码的处理相关jar】
ognl-3.0.5.jar 【Ognl表达式功能支持表】
struts2-core-2.3.4.1.jar 【struts2核心功能包】
xwork-core-2.3.4.1.jar 【Xwork核心包】

2.编写JSP页面

helloword.jsp (发起请求页面)

<a href="${pageContext.request.contextPath}/hello.action"> helloworld</a>

添加对Struts2 框架的访问链接,默认情况下框架接受以.action请求,并进行处理

success.jsp (结果页面)

<h1>Struts2 Hello</h1>

结果页面显示 struts2框架访问成功

3.编写Action处理访问Struts2框架请求

public class HelloAction {
public String execute(){
    System.out.println("hello world");
    return "success"; // 结果页面命名
  }
}

struts2 的Action类似以前编写的Servlet程序,可以处理用户提交请求,但是Struts2的Action可以POJO对象

4.配置Struts2核心控制器

web.xml
    <filter>
        <filter-name>struts2</filter-name>
        <filter-class> org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
              </filter-class>
    </filter>
    <filter-mapping>
        <filter-name>struts2</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

过滤器配置/* , 但是struts2 默认处理.action结尾请求,分发到相应Action类

5.在struts.xml配置action

<struts>
    <!-- name 随便写   extends 固定写法  -->
    <package name="default" extends="struts-default"  >
     <action name="hello" class="com.lanou.action.HelloAction" method="execute">
               <result name="success">/success.jsp</result>
     </action>
    </package>
</struts>

执行说明:

  1. 浏览器发出xxx.action请求至服务器;

  2. 服务器接收后,根据web.xml的配置,将请求发送给指定的Struts2的过滤器;

  3. 过滤器根据struts.xml的配置内容,将请求发送给xxAction类的对象,并调用默认的execute()方法;

  4. 根据execute()方法的返回结果,在struts.xml文件中根据匹配的处理果,完成向success.jsp页面跳转;

  5. 页面根据上下文中的内容,借助Struts2的OGNL表达式和Struts2标签将内容现在在页面中。(注意:在使用Struts2标签的时,首先导入Struts2的标签)

详细请求流程

请求流程图

Struts2请求流程

  1. 客户端发送请求
  2. StrutsPrepareAndExecute通过ActionMapper来决定这个Request需要调用哪个Action
  3. 如果ActionMapper决定调用某个Action,FilterDispatcher把请求的处理交给ActionProxy,这儿已经转到它的Delegate--Dispatcher来执行
  4. ActionProxy根据ActionMapping和ConfigurationManager找到需要调用的Action类
  5. ActionProxy创建一个ActionInvocation的实例
  6. ActionInvocation调用真正的Action,当然这涉及到相关拦截器的调用
  7. Action执行完毕,ActionInvocation创建Result并返回,当然,如果要在返回之前做些什么,可以实现PreResultListener

五、Struts2常用配置

1. 配置文件的加载顺序

struts2框架要能执行,必须先加载StrutsPrepareAndExecuteFilter.
在StrutsPrepareAndExecuteFilter的init方法中对Dispatcher进行了初始化.
在Dispatcher类中定义的init方法内就描述了struts2配置文件加载的顺序

init_DefaultProperties(); // [1] ---------- org/apache/struts2/default.properties
init_TraditionalXmlConfigurations(); // [2] --- struts-default.xml,struts-plugin.xml,struts.xml
init_LegacyStrutsProperties(); // [3] --- 自定义struts.properties init_CustomConfigurationProviders(); // [5] ----- 自定义配置提供
init_FilterInitParameters() ; // [6] ----- web.xml
init_AliasStandardObjects() ; // [7] ---- Bean加载

1. default.properties文件
作用:定义了struts2框架中所有常量
位置: org/apache/struts2/default.properties 
                
2. struts-default.xml
作用:配置了bean, interceptor, result等。
位置:在struts的core核心jar包.
                
struts-plugin.xml
它是struts2框架中所使用的插件的配置文件。

struts.xml            
我们使struts2所使用的配置文件。
                    
3. 自定义的struts.properties
就是可以自定义常量。
                
4. web.xml
            
在开发中,后加载文件中的配置会将先加载文件中的配置覆盖。
default.properties
struts-default.xml
struts.xml

2. 关于Action的配置

  1. <package> 作用:是用于声明一个包。用于管理action。
  1. <action> 用于声明 一个action
  1. <result> 用于确定返回结果类型

关于action配置其它细节:

  1. 关于默认值问题
<package namespace="默认值"> namespace的默认值是""
<action class="默认值"  method="默认值">
class的默认值是  com.opensymphony.xwork2.ActionSupport
method的默认值是  execute
<result name="默认值"> name的默认值是 "success" 
  1. 关于访问action的路径问题
    Action的访问路径 = 包名称空间 namespace + Action name属性
    现在的action的配置是:
<package name="default" namespace="/" extends="struts-default">
<action name="hello" class="cn.lanou.action.DefaultAction">
  <result>/hello.jsp</result>
</action>
</package>
                
当我们输入:
http://localhost/struts2_day01_2/a/b/c/hello
也访问到了action。
                
原因:struts2中的action被访问时,它会首先查找
1.namespace="/a/b/c"  action的name=hello  没有.
2.namespace="/a/b     action的name=hello  没有
3.namespace="/a"      action的name=hello  没有
 4.namespace="/"        action的name=hello  查找到了.
如果最后也查找不到,会报404错误.
  1. 默认的action。
    作用:处理其它action处理不了的路径。
<default-action-ref name="action的名称" />
配置了这个,当访问的路径,其它的action处理不了时,就会执行name指定的名称的action。
  1. action的默认处理类
    在action配置时,如果class不写。默认情况下是 com.opensymphony.xwork2.ActionSupport。
<default-class-ref class="cn.lanou.action.DefaultAction"/>
如果设置了,那么在当前包下,默认处理action请的的处理类就为class指定的类。

3. Struts常量的配置

default.properties定义了struts2 框架的大量常量,开发者可以通过改变这些常量来满足应用的需求
修改struts2 的配置常量,可以通过以下三种方式配置

  1. 配置src/struts.xml
    <constant name="struts.devMode" value="true" />
  1. 配置src/struts.properties
    struts.devMode = false
  1. 配置web.xml
    <filter>
        <filter-name>struts2</filter-name>
        <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
        <init-param>
            <param-name>struts.devMode</param-name>
            <param-value>false</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>struts2</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

常用的常量介绍

   指定默认编码集,作用于HttpServletRequest的setCharacterEncoding方法 和freemarker 、velocity的输出
    <constant name="struts.i18n.encoding" value="UTF-8"/>
   该属性指定需要Struts 2处理的请求后缀,该属性的默认值是action,即所有匹配*.action的请求都由Struts2处理。
   如果用户需要指定多个请求后缀,则多个后缀之间以英文逗号(,)隔开
    <constant name="struts.action.extension" value="action"/>
   设置浏览器是否缓存静态内容,默认值为true(生产环境下使用),开发阶段最好关闭 
    <constant name="struts.serve.static.browserCache" value="false"/>
   当struts的配置文件修改后,系统是否自动重新加载该文件,默认值为false(生产环境下使用),开发阶段最好打开 
    <constant name="struts.configuration.xml.reload" value="true"/>
   开发模式下使用,这样可以打印出更详细的错误信息 
    <constant name="struts.devMode" value="true" />
   默认的视图主题 
    <constant name="struts.ui.theme" value="simple" />
  与spring集成时,指定由spring负责action对象的创建 
    <constant name="struts.objectFactory" value="spring" />
   该属性设置Struts 2是否支持动态方法调用,该属性的默认值是true。如果需要关闭动态方法调用,则可设置该属性
   为 false
    <constant name="struts.enable.DynamicMethodInvocation" value="false"/>
   上传文件的大小限制
     <constant name="struts.multipart.maxSize" value=“10701096"/>

4. 指定多个Struts配置文件

在大部分应用里,随着应用规模的增加,系统中Action的数量也会大量增加,导致struts.xml配置文件变得非常臃肿。为了避免struts.xml文件过于庞大、臃肿,提高struts.xml文件的可读性,我们可以将一个struts.xml配置文件分解成多个配置文件,然后在struts.xml文件中包含其他配置文件。下面的struts.xml通过<include>元素指定多个配置文件:

<struts>
  <include file="struts-part1.xml"/>
  <include file="struts-part2.xml"/>
</struts>

通过这种方式,我们就可以将Struts 2的Action按模块添加在多个配置文件中。

上一篇 下一篇

猜你喜欢

热点阅读