Struts2 (一)

时间:2023-03-09 20:20:24
Struts2 (一)

1 三层架构

Struts2 (一)

2 MVC框架的原理

Struts2 (一)

3 什么是Struts2

  • Struts2是一个非常优秀的MVC框架,基于Model2设计模式。
  • 是由传统的Struts1和WebWork两个经典的框架发展而来的。
  • Struts2的核心功能:
    • ①允许POJO对象作为Action。
    • ②Action的execute方法不再与Servlet API耦合,更易于测试。
    • ③支持更多的视图技术。
    • ④基于Spring的AOP思想的拦截器机制,更易于扩展。
    • ⑤更强大、更易用。
    • ⑥输入校验功能。  

4 Servlet VS Filter

  • Servlet:
    • ①每个Servlet在内存中都是唯一的。
    • ②load-on-startup就可以使得Servlet在启动的时候完成初始化。
    • ③用户的每次请求都会经过void service(request,response)。
    • ④配置映射为/*时候,所有的请求都会经过Servlet。
  • Filter:
    • ①每个Filter在内存中都是唯一的。
    • ②启动的时候完成初始化。
    • ③用户的每次请求都会经过doFilter()方法。
    • ④配置映射为/*的时候,所有的请求都会经过Filter。  

5 Struts2环境的搭建

5.1 导入jar包

Struts2 (一)

5.2 配置核心过滤器

<?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_3_1.xsd"
         version="3.1">

    <filter>
        <filter-name>struts</filter-name>
        <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>struts</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

</web-app>

5.3 建立struts.xml的配置文件,放在应用的类路径的顶端

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE struts PUBLIC
        "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
        "http://struts.apache.org/dtds/struts-2.3.dtd">

<struts>

</struts>

6 第一个Demo

6.1 建立Action

package com.xuweiwei.action;

public class HelloAction {

    public String helloworld(){
        return "success";
    }
}

6.2 在struts.xml中配置Action

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE struts PUBLIC
        "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
        "http://struts.apache.org/dtds/struts-2.3.dtd">

<struts>

    <package name="default" namespace="/" extends="struts-default">
        <action name="hello" class="com.xuweiwei.action.HelloAction" method="helloworld">
            <result name="success">/success.jsp</result>
        </action>
    </package>

</struts>

6.3 success.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Struts2</title>
</head>
<body>
   你好,Struts2
</body>
</html>

6.4 通过http://localhost:8080/项目/hello访问

Struts2 (一)

7 上述案例的执行过程

Struts2 (一)

8 Struts2的配置文件和加载顺序

  • ①default.properties 该文件保存在struts2-core.jar包中
  • ②struts-default.xml 该文件保存在struts2-core.jar包中
  • ③struts-plugin.xml 该文件保存在struts-XXX.jar包中,struts2的插件jar包
  • ④struts.xml 该文件是web应用默认的struts配置文件
  • ⑤struts.properties 该文件是struts的默认配置文件爱你
  • ⑥web.xml应用的配置文件
  • 执行顺序按照1~6,后面的内容会覆盖前面的内容。

9 struts.xml配置文件中的内容标签

9.1 package

  • 作用:分模块化开发
  • 属性:
    • name:包的名称,唯一,必须的。
    • extends:一般都需要直接或间接的继承一个叫struts-default的包名。因为,struts框架的一些核心功能配置都在此处。
    • abstract:如果为true,说明是一个抽象包。说明让别人去继承。一般而言,没有任何action子元素的包就可以定义为抽象包。
    • namespace:名称空空间。一般以“/”开头,和动作名称一起,构成了用户的访问路径。 
  • struts.xml
<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE struts PUBLIC
        "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
        "http://struts.apache.org/dtds/struts-2.3.dtd">

<struts>

    <package name="default" namespace="/admin" extends="struts-default">
        <action name="hello" class="com.xuweiwei.action.HelloAction" method="helloworld">
            <result name="success">/success.jsp</result>
        </action>
    </package>

</struts>

Struts2 (一)

9.2 action

  • 作用:配置动作。用户什么请求,执行那个类以及那个类的方法。
  • 属性:
    • name:动作名称,必须,包中唯一的。
    • class:动作类的全名。可以不指定,默认值是ActionSupport。
    • method:执行动作类的动作方法。可以不指定,默认值是execute。  

9.3  constant

  • 作用:配置常量的值。
  • 常用的常量配置:
    • 国际化文件配置更改后,自动加载  
struts.i18n.reload=false
    • 配置文件更改后,自动加载  
struts.configuration.xml.reload=true
    • 如果为true,则开启开发模式,但是实际部署中,不建议这样使用。  
struts.devMode = true
    • struts2默认的编码    
struts.i18n.encoding=UTF-8
    • struts2框架执行url地址的后缀名  
struts.action.extension=action,,
    • 告知浏览器静态资源不要缓存  
struts.serve.static.browserCache=true

10 Action动作类

10.1 编写动作类的三种方式

  • ①动作类就是一个POJO,可以不用继承或实现任何的类或接口。
  • ②动作类实现com.opensymphony.xwork2.Action接口
    • SUCCESS
    • NONE
    • ERROR
    • INPUT
    • LOGIN  
  • ③动作类继承ActionSupport类。(推荐方式)

10.2 动作方法的书写要求

  • ①访问修饰符必须是public的。
  • ②方法必须返回String的值,如果为null,则不转向任何的视图。
  • ③方法是没有任何的参数。

10.3 动作方法的映射

  • 示例1:
    • 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_3_1.xsd"
         version="3.1">

    <filter>
        <filter-name>struts</filter-name>
        <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>struts</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

</web-app>
    • struts.xml  
<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE struts PUBLIC
        "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
        "http://struts.apache.org/dtds/struts-2.3.dtd">

<struts>

    <package name="default" namespace="/" extends="struts-default">
        <action name="*" class="com.xuweiwei.action.CustomerAction" method="{1}">
            <result name="success">/{1}.jsp</result>
        </action>
    </package>

</struts>
    • CustomerAction.java  
package com.xuweiwei.action;

import com.opensymphony.xwork2.Action;
import com.opensymphony.xwork2.ActionSupport;

public class CustomerAction extends ActionSupport{

    public String addCustomer(){
        return Action.SUCCESS;
    }

    public String updateCustomer(){
        return Action.SUCCESS;
    }

    public String deleteCustomer(){
        return Action.SUCCESS;
    }

    public String queryCustomer(){
        return Action.SUCCESS;
    }

}

Struts2 (一)

Struts2 (一)

Struts2 (一)

Struts2 (一)

  • 示例2:
    • 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_3_1.xsd"
         version="3.1">

    <filter>
        <filter-name>struts</filter-name>
        <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>struts</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

</web-app>
    • struts.xml  
<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE struts PUBLIC
        "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
        "http://struts.apache.org/dtds/struts-2.3.dtd">

<struts>

    <package name="default" namespace="/" extends="struts-default">
        <action name="*_*" class="com.xuweiwei.action.{2}Action" method="{1}{2}">
            <result name="success">/{1}{2}.jsp</result>
        </action>
    </package>

</struts>
    • CustomerAction.java  
package com.xuweiwei.action;

import com.opensymphony.xwork2.Action;
import com.opensymphony.xwork2.ActionSupport;

public class CustomerAction extends ActionSupport{

    public String addCustomer(){
        return Action.SUCCESS;
    }

    public String updateCustomer(){
        return Action.SUCCESS;
    }

    public String deleteCustomer(){
        return Action.SUCCESS;
    }

    public String queryCustomer(){
        return Action.SUCCESS;
    }

}

Struts2 (一)

Struts2 (一)

Struts2 (一)

Struts2 (一)

10.4 动态方法的调用(不要用,有危险)

  • struts.xml
<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE struts PUBLIC
        "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
        "http://struts.apache.org/dtds/struts-2.3.dtd">

<struts>

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

    <package name="default" namespace="/" extends="struts-default">
        <action name="customer" class="com.xuweiwei.action.CustomerAction">
        </action>
    </package>

</struts>
  • CustomerAction.java
package com.xuweiwei.action;

import com.opensymphony.xwork2.Action;
import com.opensymphony.xwork2.ActionSupport;

public class CustomerAction extends ActionSupport{

    public String addCustomer(){
        System.out.println("增加雇员信息");
        return Action.SUCCESS;
    }

    public String updateCustomer(){
        return Action.SUCCESS;
    }

    public String deleteCustomer(){
        return Action.SUCCESS;
    }

    public String queryCustomer(){
        return Action.SUCCESS;
    }

}
  • 访问:http://localhost:8088/customer!addCustomer

10.5 默认的Action

  • 这种方式可以用来处理用户随意输入url地址。
  • struts.xml
<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE struts PUBLIC
        "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
        "http://struts.apache.org/dtds/struts-2.3.dtd">

<struts>

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

    <package name="default" namespace="/" extends="struts-default">
        <default-action-ref name="error"/>
        <action name="error" class="com.xuweiwei.action.ErrorAction" method="error">
            <result name="error">/error.jsp</result>
        </action>

    </package>

</struts>
  • ErrorAction.java
package com.xuweiwei.action;

import com.opensymphony.xwork2.Action;
import com.opensymphony.xwork2.ActionSupport;

public class ErrorAction extends ActionSupport {

    public String error(){
        return Action.ERROR;
    }
}
  • error.jsp  
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>错误</title>
</head>
<body>
错误
</body>
</html>
  • 【注意】必须配置一个ErrorAction类处理,因为Struts2默认的Action是ActionSupport,而ActionSupport中的execute()方法的返回值默认是success,不是error,如果你不配置一个ErrorAction,并且调用其方法的返回值不是error,Struts2就找默认的,那样是找不到的。

11 Servlet规范相关的示例的获取

11.1 Struts2和Struts1的不同

  • Struts2与Servlet API解耦了。

11.2 获取Servlet相关的类

11.2.1 方式1

package com.xuweiwei.action;

import com.opensymphony.xwork2.Action;
import com.opensymphony.xwork2.ActionSupport;
import org.apache.struts2.ServletActionContext;

import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class GetServletAPIAction extends ActionSupport {

    public String execute(){

        HttpServletRequest request = ServletActionContext.getRequest();
        HttpServletResponse response = ServletActionContext.getResponse();
        ServletContext context = ServletActionContext.getServletContext();
        System.out.println("获取request对象:"+request);
        System.out.println("获取response对象:"+response);
        System.out.println("获取context对象:"+context);
        return Action.NONE;
    }
}

11.2.2 方式二

package com.xuweiwei.action;

import com.opensymphony.xwork2.Action;
import com.opensymphony.xwork2.ActionSupport;
import org.apache.struts2.ServletActionContext;
import org.apache.struts2.interceptor.ServletRequestAware;

import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class GetServletAPI2Action extends ActionSupport implements ServletRequestAware {
    private HttpServletRequest request ;

    public String execute(){
        System.out.println("获取request对象:"+request);
       return Action.NONE;
    }

    @Override
    public void setServletRequest(HttpServletRequest request) {
        this.request = request;
    }
}

12 Struts2的结果视图

  • 可以查看struts-default.xml。
 <result-types>
            <result-type name="chain" class="com.opensymphony.xwork2.ActionChainResult"/>
            <result-type name="dispatcher" class="org.apache.struts2.dispatcher.ServletDispatcherResult" default="true"/>
            <result-type name="freemarker" class="org.apache.struts2.views.freemarker.FreemarkerResult"/>
            <result-type name="httpheader" class="org.apache.struts2.dispatcher.HttpHeaderResult"/>
            <result-type name="redirect" class="org.apache.struts2.dispatcher.ServletRedirectResult"/>
            <result-type name="redirectAction" class="org.apache.struts2.dispatcher.ServletActionRedirectResult"/>
            <result-type name="stream" class="org.apache.struts2.dispatcher.StreamResult"/>
            <result-type name="velocity" class="org.apache.struts2.dispatcher.VelocityResult"/>
            <result-type name="xslt" class="org.apache.struts2.views.xslt.XSLTResult"/>
            <result-type name="plainText" class="org.apache.struts2.dispatcher.PlainTextResult" />
        </result-types>
  • 可以通过struts.xml的result标签来配置结果视图。
  • result元素:
    • 作用:配置一个结果视图
    • 属性:
      • name:逻辑视图的名称,对应的是动作类方法的返回值,可以不写,默认值是success。
      • type:指定结果类型,默认值是dispacter,就是转发。      
  • 常用的结果视图的类型:
    • dispacter:默认结果视图的类型。请求转发的一个页面。
    • redirect:请求重定向到一个页面。
    • chain:请求转发到另一个动作。
    • redirectAction:请求重定向到另一个Action。