本文包括:
1、Struts 2 概述
2、Struts 2 入门
3、Struts 2 的执行流程
4、Struts 2 的常见配置
5、struts.xml 配置
6、Struts 2 常量配置
7、Action 类的三种写法
8、Action 的访问(重难点)
1、Struts 2 概述
Struts2是一个基于MVC设计模式的Web应用框架,它本质上相当于一个servlet,在MVC设计模式中,Struts2作为控制器(Controller)来建立模型与视图的数据交互。
Struts 2是Struts的下一代产品,是在 struts 1和WebWork的技术基础上进行了合并的全新的Struts 2框架。其全新的Struts 2的体系结构与Struts 1的体系结构差别巨大。
Struts 2以WebWork为核心,采用拦截器的机制来处理用户的请求,这样的设计也使得业务逻辑控制器能够与ServletAPI完全脱离开,所以Struts 2可以理解为WebWork的更新产品。虽然从Struts 1到Struts 2有着太大的变化,但是相对于WebWork,Struts 2的变化很小。
常见的web层框架【SpringMVC、Struts2】都是基于前端控制器模型的。
前端控制器模式:集中统一化对外的请求接口,便于更好的封装内部逻辑
2、Struts 2 入门
本节需要创建一个新的WEB项目并完成Struts 的配置以及Action编写。【官网】
1、创建第一个项目--了解Struts2的开发包
2、创建第一个项目--导入包(13个基本jar包)
3、创建第一个项目--创建JSP页面--提供一个执行Action类的接口
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Insert title here</title>
</head>
<body>
<h1>Struts2的入门</h1>
<h3><a href="${pageContext.request.contextPath }/hello.action">Struts2的入门</a></h3>
</body>
</html>
4、创建第一个项目--编写Action类--处理用户请求,并相应
package com.itheima.struts.demo;
/**
* Struts2d的入门的Action类
* @author 93615
*/
public class HelloAction {
/**
* 提供一个方法 方法签名固定 返回值是String类型 方法名是execute 在这个方法中不能传递参数
* @return
*/
public String execute(){
System.out.println("HelloAction执行了——————");
return null;
}
}
5、创建第一个项目--对Action进行配置--在src下创建一个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>
<!-- Struts2为了管理Action的配置,通过包进行管理 -->
<!-- 配置Struts2的包 -->
<!-- name:包名不可重复
struts-default:Struts2中的一个配置文件,规定了Action的基本功能
extends:扩展继承了(struts-default)Action的基本功能
namespace:-->
<package name="p1" extends="struts-default" namespace="/">
<!-- 配置Action -->
<action name="hello" class="com.itheima.struts.demo.HelloAction"></action>
</package>
</struts>
6、创建第一个项目--添加前端过滤器
这一步是必须要做的操作,这是 Struts 2 核心的控制器。Struts 2 的前端控制器就是一个过滤器,需要在 web.xml 中进行配置。
<!-- 配置Struts2的核心过滤器 -->
<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>
6、创建第一个项目--改写Action、增加跳转
public String execute(){
System.out.println("HelloAction执行了——————");
return "success";
<package name="demo1" extends="struts-default" namespace="/">
<!-- 配置Action================ -->
<action name="hello" class="com.itheima.action.HelloAction" >
<!-- 配置页面的跳转=========== -->
<result name="success">/demo/success.jsp</result>
</action>
</package>
3、Struts 2 的执行流程
1、具体执行的流程:
启动服务器的时候核心过滤器会被创建会加载各种配置文件包括(struts.xml)
打开Jsp页面--->点击超链接--->请求提交到服务器端(/hello.action)
请求经过 Struts 2 的核心过滤器(StrutsPrepareAndExecuteFilter)在过滤器实现了很多功能的处理
根据struts.xml 的配置文件找到请求路径所对应具体的类,通过反射的方式让方法执行。
根据返回字符串进行跳转操作
总结: 当用户访问某一个Action时,先经过核心过滤器(前端控制器),在核心过滤器中执行一组拦截器(这组拦截器实现部分功能),根据Action的name找到目标Action类,执行Action类通过反射执行函数返回字符串结果,根据绑定值进行页面跳转
2、分析Struts2的执行流程
4、Struts 2 的常见配置
1、 XMl的提示问题--配置XML提示方便代码编写
2、配置文件的的加载顺序
我们要了解框架的工作原理就要理清楚这些相关配置文件的加载细节,掌握加载了哪些个配置文件,以及它的作用是什么。
Struts2 框架的核心是 StrutsPrepareAndExecuteFilter 过滤器,该过滤器会通过预处理加载核心的配置文件,并让部分拦截器执行工作,如图就是StrutsPrepareAndExecuteFilter 类加载的一些配置文件的顺序。
[1] init_DefaultProperties();----------加载default.properties 框架的各种常量
[2] init_TraditionalXmlConfigurations();----------加载struts-default.xml,struts-plugin.xml,struts.xml 拦截器 插件 配置
[3] init_LegacyStrutsProperties();----------加载用户自定义的 struts.properties.
[5] init_CustomConfigurationProviders();----------加载用户自定义配置提供类
[6] init_FilterInitParameters() ;----------加载web.xml中过滤器初始化参数
[7] init_AliasStandardObjects();----------加载Bean对象
配置文件加载顺序以及操作总结
-
default.properties 位于 Struts 2 的核心包下 org/apache/struts2/default.properties ,都是常量。
-
struts-default.xml 位于 Struts 2 的核心包下 struts2 框架的核心功能都是在该配置文件中配置的。默认值,不能修改!
-
struts-plugin.xml 插件
-
struts.xml 在 src 的目录下,代表用户自己配置的配置文件 开发中基本上都在该配置文件中配置常量。
-
struts.properties 可以配置常量,但基本不会在该配置文件中配置。
-
web.xml 可以配置常量,但基本不会在该配置文件中配置。
-
注意三种文件都可以配置常量 且后加载的配置文件会覆盖掉之前加载的配置文件的常量的值
5、struts.xml 配置
1、package 标签的配置:标签称为包,为了更好地管理Action配置
属性:
name 包名称,要求是唯一的,管理action配置
extends 继承,可以继承其他功能的包,继承后也就包含了其他包的功能,一般是继承 struts-default
namespace 名称空间,与<action>标签中的name属性共同决定访问路径 “” “/” “/aaa”
abstract 是否可以被继承, 用于控制是否可以被其他包的继承(true:可以继承)
2、action 标签的配置:action 标签配置Action类
属性:
name 与namspace共同决定访问路径
class Action类的全路径
method 执行Action中的哪个方法的方法名,默认execute
converter 用于设置类型转换器
3、result
标签:接收action 类中方法执行返回的结果跳转页面
name 跳转页面名称
type 跳转页面方式(默认值转发)
4、include 标签:
引入多个 struts 的配置文件(分模块开发)
随着系统中 Action 的数量增加,导致 struts.xml 配置文件变得非常臃肿。我们可以将一个 struts.xml 配置文件分解成多个配置文件,然后在 struts.xml 文件中包含其他配置文件。可以在<package>
标签中,使用<include>
标签来引入其他的 struts_xx.xml 的配置文件
<include file="com/itheima/struts/demo/struts-demo1.xml"></include>
6、Struts2的常量配置
在Struts2的框架中提供了非常多的常量(在default.properties)
例如:
struts.i18n.encoding=UTF-8 Struts2所有的post请求的中文乱码不用处理
struts.action.extension=action,, Struts2请求的默认扩展名
struts.serve.static.browserCache=true 设置浏览器是否缓存静态内容,默认值为true(生产环境下使用),开发阶段最好关闭
struts.configuration.xml.reload=false 当struts的配置文件修改后,系统是否自动重新加载该文件,默认值为false(生产环境下使用)
struts.devMode = false 开发模式下使用,这样可以打印出更详细的错误信息
1、在Struts2如果要求更改某些常量则可以在三个位置进行更改
- struts.xml
- struts.properties
- web.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>
<!-- 配置Struts2常量 :更改Action后缀-->
<constant name="struts.action.extension" value="abc"/>
<!-- Struts2为了管理Action的配置,通过包进行管理 -->
<!-- 配置Struts2的包 -->
<package name="demo" extends="struts-default" namespace="/">
<!-- 配置Action -->
<action name="hello" class="com.itheima.struts.demo.HelloAction">
<!-- 配置转发 -->
<result name="success">/demo1/success.jsp</result>
</action>
</package>
</struts>
在src下新建文件 struts.properties 进行设置
struts.action.extension=abc
<!-- 配置Struts2的核心过滤器 -->
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
<!-- 修改常量 -->
<init-param>
<param-name>struts.action.extension</param-name>
<param-value>xyz</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
Action的写法
编写Action>>配置Action(struts.xml)将Action的name和类绑定.et>>调用name.acction
POJO
public class ActionDemo01 {
public String execute(){
System.out.println("ActionDemo01执行了----POJO");
return null;
}
}
实现接口Action
/**
* 实现接口
* 提供了5个常量(5个逻辑视图名称)
* SUCCESS :成功
* ERROR ;失败
* LOGIN ;登陆出错
* INPUT ;表单校验的时候出错
* NONE
* @author 93615
*
*/
public class ActionDemo02 implements Action{
@Override
public String execute() throws Exception {
System.out.println("ActionDemo02--实现接口");
return null;
}
}
继承ActionSupport类(推荐第三种方式)
public class ActionDemo03 extends ActionSupport{
@Override
public String execute() throws Exception {
System.out.println("ActionDemo03--继承ActionSupport");
return NONE;
}
}
<struts>
<package name="p01" extends="struts-default" namespace="/">
<!-- 配置Action -->
<action name="hello01" class="com.itheima.struts.demo02.ActionDemo01"></action>
<action name="hello02" class="com.itheima.struts.demo02.ActionDemo02"></action>
<action name="hello03" class="com.itheima.struts.demo02.ActionDemo03"></action>
</package>
</struts>
Action访问
通过method
通过通配符
动态方法访问
<h1>Action 访问</h1>
<h3>通过method方法</h3>
<a href="${pageContext.request.contextPath }/userFind.action">查询用户</a><br/>
<a href="${pageContext.request.contextPath }/userUpdate.action">修改用户</a><br/>
<a href="${pageContext.request.contextPath }/userDelete.action">删除用户</a><br/>
<a href="${pageContext.request.contextPath }/userSave.action">保存用户</a><br/>
<h3>通过通配符方法</h3>
<a href="${pageContext.request.contextPath }/product_find.action">查询商品</a><br/>
<a href="${pageContext.request.contextPath }/product_update.action">修改商品</a><br/>
<a href="${pageContext.request.contextPath }/product_delete.action">删除商品</a><br/>
<a href="${pageContext.request.contextPath }/product_save.action">保存商品</a><br/>
<h3>通过动态方法访问</h3>
<a href="${pageContext.request.contextPath }/customer!find.action">查询用户</a><br/>
<a href="${pageContext.request.contextPath }/customer!update.action">修改用户</a><br/>
<a href="${pageContext.request.contextPath }/customer!delete.action">删除用户</a><br/>
<a href="${pageContext.request.contextPath }/customer!save.action">保存用户</a><br/>
<struts>
<!-- 开启动态方法访问 -->
<constant name="struts.enable.DynamicMethodInvocation" value="true"></constant>
<package name="p03" extends="struts-default" namespace="/">
<!-- 配置Action -->
<action name="userFind" class="com.itheima.struts.demo03.UserAction" method="find"></action>
<action name="userUpdate" class="com.itheima.struts.demo03.UserAction" method="update"></action>
<action name="userDelete" class="com.itheima.struts.demo03.UserAction" method="delete"></action>
<action name="userSave" class="com.itheima.struts.demo03.UserAction" method="save"></action>
<!-- 通配符配置 -->
<action name="product_*" class="com.itheima.struts.demo03.ProductAction" method="{1}"></action>
<!-- 动态路径配置 -->
<action name="customer" class ="com.itheima.struts.demo03.CustomeAction"></action>
</package>
</struts>
public class UserAction extends ActionSupport{
public String find(){
System.out.println("find---");
return NONE;
}
public String delete(){
System.out.println("delete---");
return NONE;
}
public String update(){
System.out.println("update---");
return NONE;
}
public String save(){
System.out.println("save---");
return NONE;
}
}
CRM实例