Struts2 (一)
1 三层架构

2 MVC框架的原理

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包

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访问

7 上述案例的执行过程

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>

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




- 示例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;
    }
}




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。
 
 
Struts2 (一)的更多相关文章
- 为什么做java的web开发我们会使用struts2,springMVC和spring这样的框架?
		
今年我一直在思考web开发里的前后端分离的问题,到了现在也颇有点心得了,随着这个问题的深入,再加以现在公司很多web项目的控制层的技术框架由struts2迁移到springMVC,我突然有了一个新的疑 ...
 - 菜鸟学Struts2——Interceptors
		
昨天学习Struts2的Convention plugin,今天利用Convention plugin进行Interceptor学习,虽然是使用Convention plugin进行零配置开发,这只是 ...
 - 菜鸟学Struts2——零配置(Convention )
		
又是周末,继续Struts2的学习,之前学习了,Struts的原理,Actions以及Results,今天对对Struts的Convention Plugin进行学习,如下图: Struts Conv ...
 - 菜鸟学Struts2——Results
		
在对Struts2的Action学习之后,对Struts2的Result进行学习.主要对Struts2文档Guides中的Results分支进行学习,如下图: 1.Result Types(Resul ...
 - 菜鸟学Struts2——Actions
		
在对Struts2的工作原理学习之后,对Struts2的Action进行学习.主要对Struts2文档Guides中的Action分支进行学习,如下图: 1.Model Driven(模型驱动) St ...
 - 菜鸟学Struts2——Struts工作原理
		
在完成Struts2的HelloWorld后,对Struts2的工作原理进行学习.Struts2框架可以按照模块来划分为Servlet Filters,Struts核心模块,拦截器和用户实现部分,其中 ...
 - 13、零配置Struts2开发
		
Convention 插件 从 Struts 2.1 开始, Struts 可以使用 Convention 插件来支持零配置: Convention 插件完全抛弃配置信息, 不仅不需要使用 strut ...
 - 12、Struts2表单重复提交
		
什么是表单重复提交 表单的重复提交: 若刷新表单页面, 再提交表单不算重复提交. 在不刷新表单页面的前提下: 多次点击提交按钮 已经提交成功, 按 "回退" 之后, 再点击 &qu ...
 - 11、Struts2 的文件上传和下载
		
文件上传 表单准备 要想使用 HTML 表单上传一个或多个文件 须把 HTML 表单的 enctype 属性设置为 multipart/form-data 须把 HTML 表单的method 属性设置 ...
 - 9、 Struts2验证(声明式验证、自定义验证器)
		
1. 什么是Struts2 验证器 一个健壮的 web 应用程序必须确保用户输入是合法.有效的. Struts2 的输入验证 基于 XWork Validation Framework 的声明式验证: ...
 
随机推荐
- 转深入理解 AngularJS 的 Scope作用域
			
文章转载英文:what-are-the-nuances-of-scope-prototypal-prototypical-inheritance-in-angularjs 中文:http://www. ...
 - C# DataSet数据导入Excel 修正版- .net FrameWork 4.0以上
			
引入 Microsoft.Office.Interop.Excel.dll 格式:标题加了下划线,单元格内容居中 1 using System; using System.Data; using S ...
 - api接口写好了?想过(Accept,Content-Type)?返回类型json|xml?
			
api接口写好了?想过(Accept,Content-Type)?返回类型json|xml? 起因: - A,B. A调用B提供的api接口. - A:为毛你的接口返回的是xml格式的(浏览器访问)? ...
 - 名片管理系统v1.1(tools)
			
cords_list = []def show_cords(): print("*"*80) print("欢迎使用[名片管理系统]v.1.1") print( ...
 - mysql 在B数据库下 创建一个与A数据库中一样的表
			
1.创建数据内容与结构一致(不会复制索引以及外键) create table B.test as select * from A.test; 2.把上面的步骤分开,先复制结构 create table ...
 - C陷阱:求数组长度
			
// 这是一篇导入进来的旧博客,可能有时效性问题. 程序中,当我们建立了一个int型数组:int a[]={1,2,3,4,5,6};随后我们可能需要知道它的长度,此时可以用这种方法:length = ...
 - python编码问题和逻辑运算
			
1,回顾昨天课程及作业 #1.使用while循环输入 1 2 3 4 5 6 8 9 10 ''' count = 0 while count < 10: count += 1 # count ...
 - 阿里云Centos 7.4 mssql-server
			
1.阿里云服务器控制台,开启1433端口(出入方向都要开).自从微软发布linux版本后,控制台常用端口下拉列表也增加了1433. 2.如果你没配置阿里云yum源,可参照配置一下.http://www ...
 - Redux入门示例-TodoList
			
Tip 前端技术真是日新月异,搞完 React 不搭配个数据流都不好意思了.满怀期待的心去翻了翻 flux,简直被官方那意识流的文档折服了,真是又臭又长还是我智商问题?
 - 【批处理学习笔记】第二十九课:ASCII码
			
前面的例子中,我们已经使用过一次ASCII码了,也就是那个笑脸.ASCII码是图形化的符号,可以用来点缀我们的批处理的. 在cmd窗口中我们可以通过任意一个字符的ASCII码来输入该字符,比如C ...