zoukankan      html  css  js  c++  java
  • Struts2简介、初步使用

    今日分享的是楼楼新学的一个框架,Struts2:

    一:Struts2简介:

      Struts2是一个基于MVC设计模式的Web应用框架,它本质上相当于一个servlet,在MVC设计模式中,Struts2作为控制器(Controller)来建立模型与视图的数据交互;Struts2是Struts的下一代产品,所以它是Struts1+WebWork合并的全新框架Struts 2以WebWork为核心,采用拦截器的机制来处理用户的请求,这样的设计使得业务逻辑控制器能够与ServletAPI完全脱离开。

    二:Struts2的使用:

      2.1:Struts2的环境搭配

      2.1.1:创建一个Maven项目,在pom.xml中配置Struts2框架依赖    

    <!-- 引用struts2框架核心依赖 -->
     <dependency> <groupId>org.apache.struts</groupId> <artifactId>struts2-core</artifactId> <version>2.5.13</version> </dependency>

      2.1.2:导入Struts2所需要的配置文件

           

      Struts-base.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>
        <!-- 设置编码集 -->
        <constant name="struts.i18n.encoding" value="UTF-8" />
        <!-- 开启动态方法调用 -->
        <constant name="struts.devMode" value="true" />
        <!-- 不重启的情况下能修改代码理解生效 -->
        <constant name="struts.configuration.xml.reload" value="true" />
        <!-- 和上面一样 -->
        <constant name="struts.i18n.reload" value="true" />
        <!-- 开启动态方法调用 -->
        <constant name="struts.enable.DynamicMethodInvocation" value="true" />
         <!-- 实用动态方法调用必须配置的 -->
        <package name="base" extends="struts-default" abstract="true">
            <!-- 
                在statu2.5版本之后,加了 regex:.* 默认将动态方法调用关闭,abstract 也要为true才能动态方法调用
                这是处于系统安全考虑的。
             -->
            <global-allowed-methods>regex:.*</global-allowed-methods>
        </package>
        
    </struts>

      Struts-sy.xml:

     1 <?xml version="1.0" encoding="UTF-8"?>
     2 <!DOCTYPE struts PUBLIC
     3     "-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
     4     "http://struts.apache.org/dtds/struts-2.5.dtd">
     5 <struts>
     6     <!-- 这是包的概念 能更细分action的分类-->
     7     <package name="sy" extends="base" namespace="/sy">
     8         <!-- *代表你要调用的方法 -->
     9         <action name="/dome_*"  class="com.ht.web.HelloAction" method="{1}">
    10             <!-- 实用两个*,但是推荐使用
    11                 <result name="{2}">/{2}.jsp</result>
    12              -->
    13             <result name="rs">/rs.jsp</result>
    14         </action>
    15     </package>
    16 </struts>

      Struts.xml:

    1 <?xml version="1.0" encoding="UTF-8"?>
    2 <!DOCTYPE struts PUBLIC
    3     "-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
    4     "http://struts.apache.org/dtds/struts-2.5.dtd">
    5 <struts>
    6     <include file="struts-default.xml"></include>
    7     <include file="struts-base.xml"></include>
    8     <include file="struts-sy.xml"></include>
    9 </struts>

       2.1.3:web.xml中配置核心拦截器

      StrutsPrePareAndExectueFilter就是Struts2核心拦截器,当用户请求匹配的URL时,核心栏截器执行;

      而我的配置中只要是.action结尾,就会自动执行核心拦截器。

      web.xml配置

    <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_3_1.xsd"
        version="3.1">
        <display-name>Archetype Created Web Application</display-name>
        <filter>
            <filter-name>struts</filter-name>
            <!-- 相对于中央控制器,过滤请求 -->
            <filter-class>org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter</filter-class>
        </filter>
        <filter-mapping>
            <filter-name>struts</filter-name>
            <url-pattern>*.action</url-pattern>
        </filter-mapping>
    </web-app>

      三:Struts2动态方法调用

      3.1:新建一个HellowAction类来处理action代码

    public class HelloAction /*extends ActionSupport*/ {
        /**
         * add方法
         * @return
         */
        public String add() {
             System.out.println("调用add方法。。。");
            return "rs";
        }
        /**
         * del方法
         * @return
         */
        public String del() {
            System.out.println("调用del方法。。。");
            return "rs";
        }
    }

          3.2:新建一个demo.jsp,用jsp来调用测试action代码

    <body>
        <h1>动态方法调用</h1>
        <a href="${pageContext.request.contextPath}/sy/dome_add.action">新增</a>
        <a href="${pageContext.request.contextPath}/sy/dome_del.action">删除</a>
    </body>

      若是控制台输出了调用的方法就成功了

         

      四:struts2前台传递数据到后台

       有三种方式可以实现:

      4.1 :实现 modelDrivern方法;

      创建一个Cal实体类

    package com.ht.entity;
    /**
     * Cal实体类
     * @author Administrator
     */
    public class Cal {
        
        private String num1;
        private String num2;
        public String getNum1() {
            return num1;
        }
        public void setNum1(String num1) {
            this.num1 = num1;
        }
        public String getNum2() {
            return num2;
        }
        public void setNum2(String num2) {
            this.num2 = num2;
        }
        @Override
        public String toString() {
            return "Cal [num1=" + num1 + ", num2=" + num2 + "]";
        }
    }

    在HellowAction中实现ModelDriven类

    public class HelloAction implements ModelDriven<Cal>{
        private Cal cal1 = new Cal();
    
        @Override
        public Cal getModel() {
            return cal1;
        }
        /**
         *实现 modelDrivern 接收参数值
         * @return
         */
        public String accept1() {
            System.out.println("cal1:" + cal1);
    
            return "rs";
        }
    }

     在jsp中调用action中的方法

    <h2>前台传数据给后台</h2>
        <a href="${pageContext.request.contextPath }/sy/demo_accept1.action?num1=20&&num2=5">accept1</a>

      4.2:类实例.属性名

      最好新建一个类写action代码:

    public class ActionDome {
           private Cal cal2;
    
            public Cal getCal2() {
                return cal2;
            }
    
            public void setCal2(Cal cal2) {
                this.cal2 = cal2;
            }
            /**
             * 类实例.属性名    接收参数值
             * @return
             */
            public String accept2() {
                System.out.println("cal2:"+cal2);
                return "rs";
            }
    }

      jsp调用代码

    <a href="${pageContext.request.contextPath }/sy/demo_accept2.action?cal2.num1=20&&cal2.num2=5">accept2</a>

      4.3:通过set/get方法

      在创建一个类来测试,action代码

    public class ActionTest {
        private String sex;
    
        public String getSex() {
            return sex;
        }
    
        public void setSex(String sex) {
            this.sex = sex;
        }
    
        /**
         * set/get    接收参数值
         * @return
         */
        public String accept3() {
            System.out.println(sex);
            return "rs";
        }
    }

      jsp调用代码

    <a href="${pageContext.request.contextPath }/sy/demo_accept3.action?sex=nv">accept3</a>

      四:数据交互(后台传数据至前台)

      其实因为蛮简单的,就是实现ServletRequestAware接口和ServletResponseAware接口

      4.1:注入(偶合),实现ServletRequestAware接口

    public class HelloAction implements ModelDriven<Cal>,ServletRequestAware{
        private Cal cal1 = new Cal();
        private ServletRequestAware req;
        /**
         * 实现 modelDrivern 接收参数值
         * @return
         */
        public String accept1() {
            System.out.println("cal1:" + cal1);
             //注入耦合
            req.setAttribute("cal1", cal1);
            return "rs";
        }
        @Override
        public void setServletRequest(HttpServletRequest request) {
            // TODO Auto-generated method stub
            this.req=req;
        }
    }

      4.2:非注入(偶合)

        public String accept1() {
            System.out.println("cal1:"+cal1);
            //非注入耦合
            HttpServletRequest request = ServletActionContext.getRequest();
            request.setAttribute("cal1", cal1);
            return "rs";    
        }

    今日分享到此结束!谢谢观看!

  • 相关阅读:
    POJ 3126 Prime Path
    POJ 2429 GCD & LCM Inverse
    POJ 2395 Out of Hay
    【Codeforces 105D】 Bag of mice
    【POJ 3071】 Football
    【POJ 2096】 Collecting Bugs
    【CQOI 2009】 余数之和
    【Codeforces 258E】 Devu and Flowers
    【SDOI 2010】 古代猪文
    【BZOJ 2982】 combination
  • 原文地址:https://www.cnblogs.com/huangting/p/11099782.html
Copyright © 2011-2022 走看看