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";    
    }

 

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

posted @ 2019-06-27 21:35  沦陷  阅读(814)  评论(0编辑  收藏  举报