Struts第一阶段

strust2入门与介绍

什么是Struts2

是基于MVC设计模式的WEB层框架

WEB层框架

Struts1,WebWork,Struts2,SpringMVC

Struts2的内核是基于WebWork的

前端控制器模式

Struts2的入门

  1. 解压之后:
  • apps :Struts2 里面提供的一些测试的应用
  • docs :Struts2 里面的帮助文档
  • lib :Struts2的提供的开发的jar包
  • src :Struts2提供的源码
  1. 导包,导最少的包,找到blank项目下的jar包,导这些即可
  2. 写一个jsp页面,跳转的目标的路径是xxx.action.

<h3> <a href="${pageContext.request.contextPath}/hello.action">访问Struts2框架</a></h3>

  1. 配置Struts2的核心过滤器,前端控制器(完成部分功能),会默认执行拦截器(过滤器路径在struts2-core/包后边是filter/StrutsPrepareAndExecuteFilter.class),然后会跳到配置文件中
  2. 写action类里面有一个execute方法,方法的格式是固定的:
    必须是public ,返回值是String,方法名execute,方法中没有参数

  3. 配置action类的配置文件
    struts2默认的配置文件是struts.xml,写在src下。

    • 配置文件写法:copy约束,struts标签,里边有package
      • package标签属性:name extends namespace
      • package里边有action:name class类action的全路径
  4. 修改struts2配置文件:加一个result标签
    1
    2
    3
    4
    5
    6
    7
    <struts>
       <package name="demo01" extends="struts-default" namespace="/">
           <action name="jsp中的xxx" class="类action的全路径">
               <result name="success(action传过来的字符串)">要跳转的路径</result>
           </action>
       </package>
    </struts>

struts2的执行流程

当一个页面发送一个请求的时候,首先经过核心过滤器(StrutsPrepareAndExecuteFilter),在这个过滤器中其实会执行一组拦截器(这组拦截器就完成了部分的功能),执行完这组拦截器之后,执行目标Action,返回一个结果视图,根据返回结果跳转不同界面。

struts2常见的配置

struts2的配置文件的加载顺序:(了解)

过滤器StrutsPrepareAndExecuteFilter会在服务器启动时初始化。
在过滤器中会执行dispatcher = init.initDispatcher(config);,然后在执行dispatcher.init();,再然后会执行下面的配置文件

1
2
3
4
5
6
init_DefaultProperties(); // [1]                -----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]            -----加载自定义类

这几个值规定了加载配配置文件的顺序:

  • default.properties
  • struts-default.xml
  • struts-plugin.xml
  • struts.xml
  • struts.properties
  • web.xml

主要用的后三个,顺序是由上到下

struts2的主要配置文件:

struts2中Action的配置(struts.xml)

  1. 包的配置(package)

    Struts2为了更好的管理Action,将Action分包进行管理的。

    • /< package />包中的顺序
      • name :包名,一个配置文件中不要出现重复的包名
      • extends:继承别的包,通常继承struts-default
      • namespace:名称空间,跟下边的/中的name属性共同决定访问路劲
        • namespace=””; 最后在找这个,在/之后
        • namespace=”/“; 没有指定的名称的执行这个,一般就会写这个
        • namespace=”/aaa”; 首先找带名称空间的,这个是最大化
      • abstract:是否可以被别的包继承,true表示可以应用于其他包的继承
  2. Action的配置

    • /< action /> 的配置
      • name:与名称空间共同决定访问路劲
      • class:Action类的全路径
      • method:Action中要执行的方法的名称,默认值execute

Structs2中常量的位置

Struct中常量有三个配置的位置:

  • struts.xml(推荐)
    <constant name="struts.action.extension" value="action">

  • struts.properties
    struts.actioin.extension=action

  • web.xml

1
2
3
4
5
  // <filter>中加一个
  <init-param>
     <param-name>struts.actioin.extension</param-name>
     <param-value>action</param-value>
  </init-param>

这里的struts.actioin.extension常量,表示访问的时候,路径的后缀名要加什么,默认是action, ,表示action跟空


改配置文件不用重启服务器
<constant name="struts.devMode" value="true" />

Struts2分模块开发的配置

在struts2.xml 配置文件中用<include file="要包含的子配置文件"/>

Action的编写

Action本身是一个POJO的类

POJO(plain ordinary java object)的类,简单的java类:没有继承任何类。

Action实现一个Action的接口

在action的接口中,提供了个常量(逻辑视图名称)

  • SUCCESS :成功
  • NONE :不跳转
  • ERROR :跳转到错误的页面
  • INPUT :表单校验
  • LOGIN :跳转到登陆页面

Action继承一个ActionSupport的类

ActionSupport实现Action的接口,还有好多扩展的方法
在父类里面的execute里,直接返回的SUCCESS。

以后写的时候最好使用这种方法。

Action的访问

现在已经可以访问到Action,但是一次请求对应了一个Action的,需要一个模块的多次请求添加到一个Action中。

可以在struts.xml中配配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
//页面
<h1>客户管理</h1>
<h3><a href="${ pageContext.request.contextPath }/addCustomer.action">添加客户</a></h3>
<h3><a href="${ pageContext.request.contextPath }/findCustomer.action">查询客户</a></h3>
<h3><a href="${ pageContext.request.contextPath }/updateCustomer.action">修改客户</a></h3>
<h3><a href="${ pageContext.request.contextPath }/deleteCustomer.action">删除客户</a></h3>
//编写action
public class CustomerAction extends ActionSupport{
    public String add(){
        System.out.println("保存客户...");
        return NONE;
    }
    public String find(){
        System.out.println("查询客户...");
        return NONE;
    }
    public String update(){
        System.out.println("修改客户...");
        return NONE;
    }
    public String delete(){
        System.out.println("删除客户...");
        return NONE;
    }
}
//配置action
<!-- 配置package包 -->
    <package name="demo3" extends="struts-default" namespace="/">
        <!-- 配置action -->
        <action name="addCustomer" class="com.itheima.struts2.action3.CustomerAction" method="add"/>
        <action name="findCustomer" class="com.itheima.struts2.action3.CustomerAction" method="find"/>
        <action name="updateCustomer" class="com.itheima.struts2.action3.CustomerAction" method="update"/>
        <action name="deleteCustomer" class="com.itheima.struts2.action3.CustomerAction" method="delete"/>
    </package>

通配符的方式

//第一个*代表的数就是传过来的那个参数的后部分,正好是method里的东西

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
//页面
<h1>商品管理</h1>
<h3><a href="${ pageContext.request.contextPath }/product_add.action">添加客户</a></h3>
<h3><a href="${ pageContext.request.contextPath }/product_find.action">查询客户</a></h3>
<h3><a href="${ pageContext.request.contextPath }/product_update.action">修改客户</a></h3>
<h3><a href="${ pageContext.request.contextPath }/product_delete.action">删除客户</a></h3>
//编写Action
public class ProductAction extends ActionSupport{
    public String add(){
        System.out.println("保存商品...");
        return NONE;
    }
    public String find(){
        System.out.println("查询商品...");
        return NONE;
    }
    public String update(){
        System.out.println("修改商品...");
        return NONE;
    }
    public String delete(){
        System.out.println("删除商品...");
        return NONE;
    }
}
//配置Action:
        <!-- 通配符的方式的配置 -->
        <action name="product_*" class="com.itheima.struts2.action3.ProductAction" method="{1}"/>

更通配的写法:

动态方法访问

在struts2中默认是关闭的,需要开启,在default.porperties中,需要在配置文件中修改称true

<constant name="struts.enable.DynamicMethodInvocation" value="true">

1
2
3
4
5
6
7
8
9
10
//页面
<h1>订单管理</h1>
<h3><a href="${ pageContext.request.contextPath }/order!add.action">添加订单</a></h3>
<h3><a href="${ pageContext.request.contextPath }/order!find.action">查询订单</a></h3>
<h3><a href="${ pageContext.request.contextPath }/order!update.action">修改订单</a></h3>
<h3><a href="${ pageContext.request.contextPath }/order!delete.action">删除订单</a></h3>
//配置。不用写method
<!-- 动态方法的访问 -->
<action name="order" class="com.itheima.struts2.action3.OrderAction"/>

跳转之后,如果result里边是success可以省略。

张冲 wechat
欢迎扫一扫上面的微信关注我,一起交流!
坚持原创技术分享,您的支持将鼓励我继续创,点击打赏!