zoukankan      html  css  js  c++  java
  • struts2第一章-基本用法

    一.struts简介

    1.回顾

    MVC

      M-model模型层

      V-view 视图层  前端界面

      C-controller 控制层

    struts2:

      Apache提供的开源的控制层框架,相当于servlet

    2.简介

    struts2框架是Apache一个免费开源的基于MVC设计模式的web应用框架;本质上相当于一个servlet,在MVC设计模式中,struts2作为控制器(controller)来建立模型和视图的数据交互

    3.历史

    最开始的框架是struts1,非常流行,后来发现struts有许多缺陷;

    在webwork框架基础上升级 成为struts2

    14/15年,struts2出现高危漏洞,建议采用struts2.3.15版本以上;

    4.优缺点:

    优点:

    (1)实现MVC模式,层次结构比较清晰,程序员只需要关注业务逻辑的实现

    (2)丰富的标签库,大大提供开发效率(扯淡)

    (3) struts2提供丰富的拦截器实现(重点)

    (4)通过配置文件,就可以掌握整个系统的各个部分之间的关系

    (5)异常处理机制,只需要在配置文件中进行相关异常处理,就可以对异常进行处理

    (6)struts2可扩展性比较高,所有的设置都可以在配置文件中实现

    (7)面向切面编程的思想在struts2有很好的体现,就是拦截器

    缺点:

    (1)跳转到页面时,需要配置页面路径(繁琐)

    (2)数据类型转换,默认把所有提交的数据当做String类型,提交的数据复杂时需要我们自己提供类型转换器

    二.struts2入门

    使用的struts2版本:2.3.3.GA

    1.下载:

    https://archive.apache.org/dist/struts/

    2.步骤:

    (1)解压

    (2)复制jar到自己web项目的lib中

    (3)复制filter

    把下图中web.xml中的filter配置复制到自己项目的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>

    (4)复制struts.xml文件

    把此文件复制到自己项目的src目录中

    然后修改自己的struts.xml

    <struts>

     

        <!-- 常量配置 -->

        <!-- 动态方法调用:true-开启,false-不开启 -->

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

        <!-- 是否开启调试模式:true-是,false-否 -->

        <constant name="struts.devMode" value="true" />

     

        <package name="default" namespace="/" extends="struts-default">

        <action name="helloAction" class="com.yujun.action.HelloAction">

             <result>/hello.jsp</result>

        </action>

        </package>

    </struts>

    6)页面

    hello.jsp

    index.jsp

    三、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进行处理

    struts2.0-2.1.2版本 : FilterDispatcher

    struts2.1.3版本开始:StrutsPrepareAndExecuteFilter

    2.方法的调用

    请求struts2的action时,默认调用action类中的executr()方法:  若要修改默认的方法,需要在struts.xml中action节点中配置method属性

    3.方法返回值

    在请求struts2的action方法时,默认返回值是"success";若要修改默认的返回值,

    需要在struts.xml中的result中的name属性

    4.action类

    通常我们自己定义action类,需要继承ActionSupport

    这个父类提供了常有的常量方法

    四、struts2执行流程

    (1)客户端初始化一个指向Servlet容器(例如Tomcat)的请求 (客户端提交一个HttpServletRequest请求。)

    (2)请求被提交到一系列的过滤器(Filter)。

    如(ActionContextCleanUp、其他过滤器(SiteMesh等)、 FilterDispatcher。注意:这里是有顺序的,先ActionContext CleanUp,再其他过滤器(Othter Filters、SiteMesh等),最后到FilterDispatcher。

    FilterDispatcher是控制器的核心,就是MVC的Struts 2实现中控制层(Controller)的核心。

    (3)FilterDispatcher询问ActionMapper是否需要调用某个Action来处理这个(HttpServlet Request)请求,如果ActionMapper决定需要调用某个Action,FilterDispatcher则把请求的处理交给ActionProxy。

    (4)  ActionProxy通过Configuration Manager(struts.xml)询问框架的配置文件,找到需要调用的Action类。

    (5)ActionProxy创建一个ActionInvocation实例,同时ActionInvocation通过代理模式调用Action。但在调用之前,ActionInvocation会根据配置加载Action相关的所有Interceptor(拦截器)。

    (6)Action执行完毕后,ActionInvocation负责根据struts.xml中的配置找到对应的返回结果result。

    五、动态调用action方法

    struts2执行action方法时,默认执行execute方法,对于开发不方便虽然可以在struts.xml中配置默认的方法,但是还是有缺陷,只能执行一个方法;

    解决方案:

    1.方法的动态调用

    2.使用通配符

    1、动态使用

    (1)需要在struts.xml中开启动态方法

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

    (2)语法:

    actionName!方法名   或   actionName!方法名.action

    案例

    public class Demo2Action extends ActionSupport {
    
        @Override
        public String execute() throws Exception {
            System.out.println("Demo2Action...execute...");
            return SUCCESS;
        }
        
        public String m1(){
            System.out.println("Demo2Action...m1...");
            return SUCCESS;
        }
        public String m2(){
            System.out.println("Demo2Action...m2...");
            return SUCCESS;
        }
        public String m3(){
            System.out.println("Demo2Action...m3...");
            return SUCCESS;
        }
    }
    Demo2Action
    <action name="demo2Action" class="com.yujun.maven.action.Demo2Action">
                <result>/demo2.jsp</result>
    </action>
    struts.xml
    <h3><a href="demo2Action">访问demo2Action中的execute方法</a></h3>
        <h3><a href="demo2Action!execute">访问demo2Action中的execute方法</a></h3>
        <h3><a href="demo2Action!execute.action">访问demo2Action中的execute方法</a></h3>
        
        <h3><a href="demo2Action!m1">访问demo2Action中的m1方法</a></h3>
        <h3><a href="demo2Action!m2">访问demo2Action中的m2方法</a></h3>
        <h3><a href="demo2Action!m3">访问demo2Action中的m3方法</a></h3>
    index.jsp

    2.通配符

    使用"*"

    <action name="demo2Action_*" class="com.yujun.maven.action.Demo2Action" method="{1}">
                <result>/demo2.jsp</result>
    </action>
    
    <h3><a href="demo2Action_m2">访问demo2Action中的m2方法</a></h3>
        <h3><a href="demo2Action_m3">访问demo2Action中的m3方法</a></h3>
    案例

    六、提交表单数据到action

    使用成员变量

    注意:

    (1)       action类中成员变量名称必须和表单中元素name一样

    (2)       action类中成员变量必须有set和get方法,利用反射来访问成员变量

    (3)       action类中成员变量名称前两个字母必须小写开头

    1、表单页面

    2、action类

    @Getter
    @Setter
    public class Demo3Action extends ActionSupport {
        private String username;
        private int age;
        
        
        public String add(){
            System.out.println("姓名:"+username+",年龄:"+age);
            
            return SUCCESS;
        }
        
    }

    3、struts.xml配置

    <action name="demo3Action" class="com.yujun.maven.action.Demo3Action">
                <result>/demo3_success.jsp</result>
    </action>

    4、成功页面

    <h3>
            姓名:${username },年龄:${age }
        </h3>

    七、封装表单数据

    前面我们实现了表单数据的提交,在action类中进行获取数据;

    如果表单的字段很多(20个),action类中声名对应个数的成员变量,action类代码会显得臃肿,怎么解决?

    解决方案:

             把表单中的数据字段进行封装,封装对象,然后在action类中使用对象访问即可;

    注意:

    (1)       对象的实体类中每个成员变量需要有公共的set和get方法

    (2)       action类中的对象属性必须有公共的set和get方法

    1、表单页面

    2、实体类

    @Setter
    @Getter
    //@ToString
    public class User {
        private String username;
        private int age;
        
        @Override
        public String toString() {
            return "User[usernmae="+username+",age="+age+"]";
        }
    }

    3、action类

    @Getter
    @Setter
    public class Demo4Action extends ActionSupport {
    
        private User user;
        
        
        public String add(){
            System.out.println(user);
            return SUCCESS;
        }
        }

    4、成功页面

    h3>
            姓名:${user.username },年龄:${user.age }
        </h3>

    5、struts.xml配置

    <action name="demo4Action" class="com.yujun.maven.action.Demo4Action">
                <result>/demo4_success.jsp</result>
    </action>
  • 相关阅读:
    读《构建之法》有感
    作业3
    作业2
    个人简介
    闽江学院2015-2016学年下学期《软件测试》课程-第五次博客作业
    新手起航
    闽江学院2015-2016学年下学期《软件测试》课程-第二次作业(个人作业)3137102420 林恩典 软服1班 http://www.cnblogs.com/11443828qq
    个人简介
    构建之法心得体会
    第三次博客作业
  • 原文地址:https://www.cnblogs.com/faded8679/p/10737642.html
Copyright © 2011-2022 走看看