美文网首页
struts2入门一

struts2入门一

作者: 小咴 | 来源:发表于2018-08-30 13:30 被阅读0次

    什么是struts2

    Struts2是一个基于MVC设计模式的Web应用框架,它本质上相当于一个servlet,在MVC设计模式中,Struts2作为控制器(Controller)来建立模型与视图的数据交互。

    Struts2是Struts的下一代产品,是在 struts 1和WebWork的技术基础上进行了合并的全新的Struts 2框架。

    常见的WEB层框架

    struts2  struts   Webwork   springMVC

    基于前端控制器的模式的WEB层框架

       传统的开发模式:每一个请求都对应一个Servlet,这样会造成一个项目中的servlet过多。
       在struts2中,所有的请求事先都会经过一个前端控制器,在前端控制器实现部分的功能,然后剩下的功能交由Action完成。
       struts2前端控制器是由过滤器来实现的,在访问资源之前,所有的东西都会经过这个过滤器。

    传统开发模式.png 前端控制器模型.png

    struts2快速入门

    struts2 官网    我们这里使用的是struts2.5版本

    struts2.5 jar包.png

    创建一个JSP页面

    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
        <title>Title</title>
    </head>
    <body>
        <p>struts2入门一</p>
        <form action="${pageContext.request.contextPath}/demo.action" method="post">
            username:<input type="text" name="username"><br/>
            password:<input type="password" name="password"><br/>
            <input type="submit" value="submit" />
        </form>
    </body>
    </html>
    

    编写一个Action

    public class HelloAction {
        public String execute() {
            System.out.print("hello world");
            return "none";
        }
    }
    

    接下来,将JSP页面的数据提交到Action中,需要我们对Action进行配置

    • 在src目录下新建一个struts.xml文件,并写上以下代码
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE struts PUBLIC
            "-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
            "http://struts.apache.org/dtds/struts-2.5.dtd">
    <struts>
        <package name="demo" extends="struts-default" namespace="/">
            <action name="demo" class="cn.robin.demo01.action.HelloAction"  />
        </package>
    </struts>
    

    最后一步就是配置核心过滤器

    • 在web.xml中进行配置
    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
             version="4.0">
        <filter>
            <filter-name>struts2</filter-name>
            <filter-class>org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter</filter-class>
        </filter>
        <filter-mapping>
            <filter-name>struts2</filter-name>
            <url-pattern>/*</url-pattern>
        </filter-mapping>
    </web-app>
    

    启动服务器之后,通过浏览器访问的时候,我们只看到控制台中输出hello world,浏览器中并没有出现页面跳转。
    通过Action类的返回值,并在struts2.xml文件进行配置,我们就能实现页面跳转的功能。

    • 修改 HelloAction
    public class HelloAction {
        public String execute() {
            return "success";
        }
    }
    
    • 修改struts.xml
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE struts PUBLIC
            "-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
            "http://struts.apache.org/dtds/struts-2.5.dtd">
    <struts>
          <package name="demo" extends="struts-default" namespace="/">
              <action name="demo" class="cn.robin.demo01.action.HelloAction" >
                  <!--配置跳转页面,通过Action的返回值,跳转到index.jsp页面-->
                  <result name="success" >/index.jsp</result>
              </action>
        </package>
    </struts>
    

    重新发布项目,继续通过浏览器访问,我们可以看出,在访问JSP页面提交数据之后,页面会跳转到index.jsp,我们这样就实现了页面跳转的功能。

    struts2常见的配置

    • 配置文件的加载顺序
      每次客户端访问服务器的时候,都必须经过struts2的核心过滤(StrutsPrepareAndExecuteFilter),该过滤器有两个功能:预处理和执行。
      • 预处理:用来加载配置文件,对应过滤器的init()方法
      • 执行:过滤器拦截功能,对应过滤器的doFilter()方法


        StrutsPrepareAndExecuteFilter类中方法

    在StrutsPrepareAndExecuteFilter类中的init()方法,调用init.initDispatcher(config)

    • 调用init().png

    在init.initDispatcher(config)中,又调用类init()方法

    • init().png
    • 配置文件加载代码
    • init_DefaultProperties(); // [1] 加载org.apache.struts.default.properties配置的所有常量

    • init_TraditionalXmlConfigurations(); // [2] 加载struts-default.xml struts-plugin.xml struts.xml

    • init_LegacyStrutsProperties(); // [3] 加载用户自定义struts.properties

    • nit_CustomConfigurationProviders(); // [5] 加载用户配置的提供对象

    • init_FilterInitParameters() ; // [6] 加载web.xml

    • init_AliasStandardObjects() ; // [7] 加载标准对象

    前面3个配置文件是属于struts2内部的配置文件,我们无法修改。
    struts.xml struts.properties web.xml是我们可以修改的文件。
    这三个配置文件可以修改struts2常量的值,加载的时候有一定的顺序,但是,后加载的配置文件一定会覆盖先在家的配置文件的值。

    Action的配置

    • struts2核心配置文件是struts.xml,该文件用来配置Action和请求的对应关系
    • struts2核心的组件是Action和过滤取,使用包的方式来管理它们。一个包可以包含多个Action和过滤器。在struts.xml中,用<package>来表示。

    1. package

    属性 说明
    name 必填属性,该包的名称,用来被其它包引用的key
    namespace 可选属性,用于定义该包的名称空间
    extends 可选属性,用于说明该包继承哪个包,可以继承包中Action和拦截器
    abstract 可选属性,指出该包是不是抽象包,抽象包不能定义Action
    • extends一般值为struts-default,这样就继承来struts2默认的过滤器等功能。
    • namespace属性的值
      • 默认名称空间:namespace = ""
      • 根名称空间:namespace = "/"
      • 一般的名称空间:namespace = "/xxx"

    2. Action

    • Action的配置就是讲一个请求的URL映射到一个Action类中
    属性 说明
    name 必填属性,标识Action,指定了Action访问的URL
    class 可选属性,指定了Action的全路径类名
    method 可选属性,指定了请求Action时跳用的方法
    converter 可选属性,指定类型转换器的类
    • namespace和name共同指定乐访问路径
    • class是类的全路径名
    • method默认是execute()

    3. 常量的配置

    1. 在struts.xml中用<constant>
     <constant name="struts.i18n.encoding" value="UTF-8" />
    
    1. 在web.xml中用<init-param>
    <init-param>
        <param-name>struts.i18n.encoding</param-name>
        <param-value>UTF-8</param-value>
    </init-param>
    
    1. 在struts-properties中配置
    struts.i18n.encoding = UTF-8
    

    4. 分模块开发的配置

    • 为了解决不同人操作同一个 struts.xml,我们可以使用<include>标签引入其它的struts.xml(默认只加载WEB-INF classes下面的struts.xml)
    <include file="cn/robin/demo/struts.xml" />
    

    注意:每一个子struts.xml,必须都含有DTD约束,struts2配置文件的信息等

    Action的编写

    1. 一个POJO(Plain Ordinary Java Object)类
    /*
    要有一个无参数的构造方法和一个execute()方法
    execute()方法要求
      public
      返回一个字符串,指向下个页面Result
      方法没有参数
    */
    public class HelloAction {
        public String execute() {
            return "none";
        }
    }
    
    1. 实现Action接口
    public class MyAction implements Action {
        @Override
        public String execute() throws Exception {
            return Action.SUCCESS;
        }
    }
    

    该接口还定义了5个常量

    • 五个常量.png
    1. 继承ActionSupport类(推荐使用)
    public class MyActionSupport extends ActionSupport {
        @Override
        public String execute() throws Exception {
            return SUCCESS;
        }
    }
    

    Action的访问

    之前我们是一个请求编写一个Action,那么当很多的请求的时候,我们需要编写很多个Action。现在,我们需要做的就是如何多个请求对应一个Action。
    1.编写页面

    <body>
        <a href="${pageContext.request.contextPath}/saveAction.action" >保存</a>
        <a href="${pageContext.request.contextPath}/addAction.action" >增加</a>
        <a href="${pageContext.request.contextPath}/updateAction.action" >修改</a>
        <a href="${pageContext.request.contextPath}/deleteAction.action" >删除</a>
    </body>
    

    2.编写Action

    public class Demo extends ActionSupport {
        public String save() {
            return NONE;
        }
        public String add() {
            return NONE;
        }
        public String update() {
            return NONE;
        }
        public String delete() {
            return NONE;
        }
    }
    

    3.配置Action

    <package name="demo" extends="struts-default" namespace="/">
        <action name="action" class="cn.robin.demo.action.HelloAction"  method="save" />
        <action name="action" class="cn.robin.demo.action.HelloAction"  method="add" />
        <action name="action" class="cn.robin.demo.action.HelloAction"  method="update" />
        <action name="action" class="cn.robin.demo.action.HelloAction"  method="delete" />
    </package>
    
    • 但是我们发现,同一个Action配置了很多次,我们只需要修改method的值而已。有没有可以只需要配置一次的呢?答案是有的!有两种方式

    1.使用通配符配置方式

    • 编写Action
    public class Demo extends ActionSupport {
        public String save() {
            return NONE;
        }
        public String add() {
            return NONE;
        }
        public String update() {
            return NONE;
        }
        public String delete() {
            return NONE;
        }
    }
    
    • 编写页面
    <body>
        <a href="${pageContext.request.contextPath}/demo_saveAction.action" >保存</a>
        <a href="${pageContext.request.contextPath}/demo_addAction.action" >增加</a>
        <a href="${pageContext.request.contextPath}/demo_updateAction.action" >修改</a>
        <a href="${pageContext.request.contextPath}/demo_deleteAction.action" >删除</a>
    </body>
    
    • 编写配置文件
    <package name="demo" extends="struts-default" namespace="/">
        <action name="demo_*" class="cn.robin.demo.action.HelloAction"  method="{1}" />
    </package>
    

    2.动态方法访问

    • 动态方法访问在struts2默认是不打开的,需要进行配置
    <constant name="struts.enable.DynamicMethodInvocation" value="true" />
    
    • 编写Action
    public class Demo extends ActionSupport {
        public String save() {
            return NONE;
        }
        public String add() {
            return NONE;
        }
        public String update() {
            return NONE;
        }
        public String delete() {
            return NONE;
        }
    }
    
    • 编写配置文件
    <package name="action" extends="struts-default" namespace="/">
        <action name="hello" class="cn.robin.demo.action.HelloAction"  />
    </package>
    
    • 编写页面
    <body>
        <a href="${pageContext.request.contextPath}/hello!save.action" >保存</a>
        <a href="${pageContext.request.contextPath}/hello!add.action" >增加</a>
        <a href="${pageContext.request.contextPath}/hello!update.action" >修改</a>
        <a href="${pageContext.request.contextPath}/hello!delete.action" >删除</a>
    </body>
    

    相关文章

      网友评论

          本文标题:struts2入门一

          本文链接:https://www.haomeiwen.com/subject/rxfrwftx.html