Strust2框架笔记01_XML配置_action编写
1.Struts2概述
1.1 什么是Struts2
- 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的变化很小。
- Struts2是一个基于MVC设计模式的web层框架,Struts2的内核相对于Struts来讲已经发生巨大变化。
- 常见的web框架
- Struts2
- Struts1
- Webwork
- SpringMVC
1.2 Web层框架基于前端控制器模型设计
前端控制器模型

2. Struts2入门案例
2.1 Struts2的开发环境
2.2 解压开发包
解压struts-2.3.24-all
apps----------Struts2提供的应用,war文件:web项目打成war包。直接放入到tomcat可以允许。
docs ----------Struts2的开发文档和API
lib--------------Strtus2框架的开发的jar包
src-------------Struts2的源码
2.3 创建项目,引入jar包
- 将..\struts-2.3.24-all\struts-2.3.24\apps下的struts2-blank.war包拷贝到tomcat的webapps目录下,启动tomcat服务器,war包会自动解压成一个工程。
- 打开解压的该工程找到lib目录下就可以看到建立一个最简单的Struts2工程需要的jar包了。

- 将这些jar包拷贝到新建的工程中
2.4 创建一个JSP页面
WebContent/demo1/demo1.jsp
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Insert title here</title>
</head>
<body>
<h2>Struts2的入门</h2>
<h3><a href="${pageContext.request.contextPath }/hello.action">Struts2的入门</a></h3>
</body>
</html>
2.5 编写Action的类
package com.itzhouq.struts.demo1;
/**
* Struts2的入门的Action类
*
*/
public class HelloAction {
/**
* 提供一个方法:
* *方法签名固定的,公有的,返回值是String类型,方法名为execute,在这个方法中不能传递参数
*/
public String execute() {
System.out.println("HelloAction执行了。。。。");
return null;
}
}
2.6 对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的包=========== -->
<package name="demo1" extends="struts-default" namespace="/">
<!-- 配置Action===== -->
<action name="hello" class="com.itzhouq.struts.demo1.HelloAction"/>
</package>
</struts>
2.7 配置前端控制器(核心过滤器)
- 在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>
2.8 测试
- 发布项目
- 访问JSP的文件,在控制台能打印相关信息。
2.9 改写Action中的方法的返回值
package com.itzhouq.struts.demo1;
/**
* Struts2的入门的Action类
*
*/
public class HelloAction {
/**
* 提供一个方法:
* *方法签名固定的,公有的,返回值是String类型,方法名为execute,在这个方法中不能传递参数
*/
public String execute() {
System.out.println("HelloAction执行了。。。。");
return "success";
}
}
2.10 改写struts.xml
<struts>
<!-- Struts2为了管理Action的配置,通过包进行管理 -->
<!-- 配置Struts2的包=========== -->
<package name="demo1" extends="struts-default" namespace="/">
<!-- 配置Action===== -->
<action name="hello" class="com.itzhouq.struts.demo1.HelloAction">
<!-- 配置页面的跳转 -->
<result name="success">/demo1/success.jsp</result>
</action>
</package>
</struts>
2.11 编写success.jsp
<body>
<h1>页面跳转成功!!!</h1>
</body>
2.12 再次测试
- 访问项目地址,控制台打印了
HelloAction执行了。。。。信息,页面跳转到了success.jsp页面。
3. Struts2的执行流程
- 当用户访问到某一个Action的时候,先经过核心过滤器,在核心过滤器中执行一组核心拦截器(这组拦截器实现部分功能),执行目标Action,根据Action的返回值,进行页面跳转。

4. Struts2的常见配置
4.1 XML的提示问题
- 断网条件下,xml的提示需要手动配置本地dtd文件
- 首先复制xml文件中的连接http://struts.apache.org/dtds/struts-2.3.dtd,再进行以下配置

4.2 Struts2的配置文件的加载顺序(了解)
4.2.1 源码:Struts2的配置文件的加载顺序

- init_DefaultProperties(); ------------------------------------------------------------加载default.properties
- init_TraditionalXmlConfigurations(); -----加载struts-default.xml、struts-plugin.xml、struts.xml
- init_LegacyStrutsProperties();------------------------------------------------------加载struts.properties
- init_CustomConfigurationProviders();-------------------------------------------------加载配置提供类
- init_FilterInitParameters() ;------------------------------------------加载web.xml中过滤器初始化参数
- init_AliasStandardObjects() ;----------------------------------------------------------------加载Bean对象
4.2.2 加载顺序
default.properties
struts-default.xml
struts-plugin.xml
struts.xml
struts.properties
web.xml
- 前三个是框架提供的配置文件,后三个都可以配置Struts2的常量
- 注意:后配置的常量的值会覆盖先配置的常量的值。
4.3 Action的配置
4.3.1 package相关配置
package标签称为包,这个包与Java中的包的概念不一致。这个包为了更好管理action的配置。
package标签的属性
name:包的名称,只有在一个项目中不重名即可。
extends:继承哪个包,通常值为struts-default。
namespace:名称空间,与
<action>标签中的name属性共同决定访问路径。名称空间有三种写法:
带名称的名称空间:namespace=”/aaa”
跟名称空间:namespance=”/”
默认名称空间:namespace=””
abstract :抽象的,用于其他包的继承.
4.3.2 action相关配置
- action标签配置Action类.
- action标签的属性:
- name :与namespace共同决定访问路径
- class :Action类的全路径
- method :执行Action中的哪个方法的方法名,默认值execute
- converter :用于设置类型转换器
4.4 Struts2中常量的配置
在Struts2的框架中,提供了非常多的常量,主要在default.properties中
struts.i18n.encoding=UTF-8 ----Struts2中所有的post请求的中文乱码不用处理。
struts.action.extension=action,, ----Struts2请求的默认的扩展名。默认扩展名是.action或者什么都不写。
在Struts2中修改一些常量的值:可以与三个位置
struts.xml中进行修改
<!-- 配置Struts2的常量 -->
<constant name="struts.action.extension" value="abc"/>
struts.properties中进行修改
struts.action.extension=action
web.xml中进行修改
<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>
一般在struts.xml中进行修改,如果在三个文件中都修改,则以web.xml中为准。
4.5 分模块开发的配置
include的配置,引入多个struts.xml配置文件
<include file="com/itzhouq/struts/demo1/struts_demo1/xml"/>
5. Action的访问
5.1 Action的三种写法
5.1.1 方式一:Action类是POJO类
package com.itzhouq.struts.demo2;
/**
* Action的编写方式:Action类是一个POJO类
* @author itzhouq
*
*/
public class ActionDemo1 {
public String execute() {
System.out.println("ActionDemo1执行了.......");
return null;
}
}
5.1.2 方式二:Actions实现了一个Action的接口
package com.itzhouq.struts.demo2;
import com.opensymphony.xwork2.Action;
/**
* Action的编写方式二:实现一个Action接口
* * 实现接口的这种方式:提供了五个常量(五个逻辑视图的名称)
* *SUCCESS:成功
* *ERROR:失败
* *LOGIN:登录出错页面跳转
* *INPUT:表单校验的时候出错
* *NONE:不跳转
*
* @author itzhouq
*
*/
public class ActionDemo2 implements Action {
@Override
public String execute() throws Exception {
System.out.println("ActionDemo2执行了..........");
return null;
}
}
5.1.3 方式三:Action类继承ActionSupport类【推荐】
package com.itzhouq.struts.demo2;
import com.opensymphony.xwork2.ActionSupport;
/**
* Action的编写方式三:Action类继承ActionSupport类
* ***推荐使用继承ActionSupport的方式:
* ***ActionSupport提供了数据校验、国际化等一系列操作的方法。
* @author itzhouq
*
*/
public class ActionDemo3 extends ActionSupport {
@Override
public String execute() throws Exception {
System.out.println("ActionDemo3执行了............");
return NONE;
}
}
三种写法在配置文件的配置信息:
<package name="demo2" extends="struts-default" namespace="/">
<!-- 配置Action===== -->
<action name="ActionDemo1" class="com.itzhouq.struts.demo2.ActionDemo1"></action>
<action name="ActionDemo2" class="com.itzhouq.struts.demo2.ActionDemo2"></action>
<action name="ActionDemo3" class="com.itzhouq.struts.demo2.ActionDemo3"></action>
</package>
5.2 Action的访问
5.2.1 通过method设置
首先写一个JSP页面../WebContent/demo3/demo3.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>Action的访问</h1>
<h3>通过method方式</h3>
<a href="${ pageContext.request.contextPath }/userFind.action">查询用户</a>
<a href="${pageContext.request.contextPath }/userDelete.action">删除用户</a>
<a href="${pageContext.request.contextPath }/userUpdate.action">修改用户</a>
<a href="${pageContext.request.contextPath }/userSave.action">保存用户</a>
</body>
</html>
编写Action类com.itzhouq.struts.demo3.UserAction
package com.itzhouq.struts.demo3;
import com.opensymphony.xwork2.ActionSupport;
/**
* Action的访问方式:通过method方式
* @author itzhouq
*
*/
public class UserAction extends ActionSupport {
public String find() {
System.out.println("查询用户.......");
return NONE;
}
public String delete() {
System.out.println("删除用户.......");
return NONE;
}
public String update() {
System.out.println("更新用户.......");
return NONE;
}
public String save() {
System.out.println("保存用户.......");
return NONE;
}
}
在和Action同一个包写编写配置问价com/itzhouq/struts/demo3/struts_demo3.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的包=========== -->
<package name="demo3" extends="struts-default" namespace="/">
<!-- 配置Action===== -->
<action name="userFind" class="com.itzhouq.struts.demo3.UserAction" method="find"></action>
<action name="userDelete" class="com.itzhouq.struts.demo3.UserAction" method="delete"></action>
<action name="userUpdate" class="com.itzhouq.struts.demo3.UserAction" method="update"></action>
<action name="userSave" class="com.itzhouq.struts.demo3.UserAction" method="save"></action>
</package>
</struts>
在主配置文件中引入struts_demo3.xml
<include file="com/itzhouq/struts/demo3/struts_demo3.xml"/>
5.2.2 通过通配符的方式【掌握】
编写Action类ProductAction
package com.itzhouq.struts.demo3;
import com.opensymphony.xwork2.ActionSupport;
public class ProductAction extends ActionSupport {
public String find() {
System.out.println("查找商品....");
return NONE;
}
public String update() {
System.out.println("更新商品....");
return NONE;
}
public String delete() {
System.out.println("删除商品....");
return NONE;
}
public String save() {
System.out.println("保存商品....");
return NONE;
}
}
在../struts_demo3.xml配置文件中添加
<!-- 通配符的方式 -->
<action name="product_*" class="com.itzhouq.struts.demo3.ProductAction" method="{1}"></action>
通配符的配置

5.2.3 动态方法访问
开启动态方法访问,在struts_demo3.xml配置文件中添加
<!-- 开启动态方法访问 -->
<constant name="struts.enable.DynamicMethodInvocation" value="true"></constant>
动态方法访问的配置
<!-- 动态方法访问的方式 -->
<action name="customer" class="com.itzhouq.struts.demo3.CustomerAction"></action>
编写访问路径jsp文件
<h3>通过动态方法访问的方式</h3>
<a href="${ pageContext.request.contextPath }/customer!find.action">查询用户</a>
<a href="${ pageContext.request.contextPath }/customer!update.action">查询用户</a>
<a href="${ pageContext.request.contextPath }/customer!delete.action">查询用户</a>
<a href="${ pageContext.request.contextPath }/customer!save.action">查询用户</a>
Strust2框架笔记01_XML配置_action编写的更多相关文章
- 使用Strust2框架写HelloWorld
使用Strust2框架写HelloWorld 一.创建JavaWeb项目 二.搭建Stust2 FrameWork开发环境 三步完成Struts2 FrameWork开发环境的搭建 1.加入搭建Str ...
- MyBatis 框架笔记
Mybatis 框架笔记 ------技术源于热爱! 获取更多内容请关注小编的个人微信公众平台 1 Mybatis入门 1.1 单独使用jdbc编程问题总结 1.1.1 jd ...
- 《玩转Django2.0》读书笔记-Django配置信息
<玩转Django2.0>读书笔记-Django配置信息 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 项目配置是根据实际开发需求从而对整个Web框架编写相应配置信息. ...
- Scrapy笔记10- 动态配置爬虫
Scrapy笔记10- 动态配置爬虫 有很多时候我们需要从多个网站爬取所需要的数据,比如我们想爬取多个网站的新闻,将其存储到数据库同一个表中.我们是不是要对每个网站都得去定义一个Spider类呢? 其 ...
- [Java] SSH框架笔记_SSH三大框架的工作原理及流程
Hibernate工作原理及为什么要用? 原理:1.通过Configuration().configure();读取并解析hibernate.cfg.xml配置文件2.由hibernate.cfg.x ...
- asp.Net Core免费开源分布式异常日志收集框架Exceptionless安装配置以及简单使用图文教程
最近在学习张善友老师的NanoFabric 框架的时了解到Exceptionless : https://exceptionless.com/ !因此学习了一下这个开源框架!下面对Exceptionl ...
- Tomcat是什么:Tomcat与Java技、Tomcat与Web应用以及Tomcat基本框架及相关配置
1.Tomcat是什么 Apache Tomcat是由Apache Software Foundation(ASF)开发的一个开源Java WEB应用服务器. 类似功能的还有:Jetty. ...
- 【读书笔记】读《编写可维护的JavaScript》 - 编程实践(第二部分)
本书的第二个部分总结了有关编程实践相关的内容,每一个章节都非常不错,捡取了其中5个章节的内容.对大家组织高维护性的代码具有辅导作用. 5个章节如下—— 一.UI层的松耦合 二.避免使用全局变量 三.事 ...
- C#实现多级子目录Zip压缩解压实例 NET4.6下的UTC时间转换 [译]ASP.NET Core Web API 中使用Oracle数据库和Dapper看这篇就够了 asp.Net Core免费开源分布式异常日志收集框架Exceptionless安装配置以及简单使用图文教程 asp.net core异步进行新增操作并且需要判断某些字段是否重复的三种解决方案 .NET Core开发日志
C#实现多级子目录Zip压缩解压实例 参考 https://blog.csdn.net/lki_suidongdong/article/details/20942977 重点: 实现多级子目录的压缩, ...
随机推荐
- 用Rider写一个有IOC容器Autofac的.net core的程序
一:Autofac是一个和Java里的Spring IOC容器一样的东西,不过它确实没有Spring里的那么方便,主要是在于它没有提供足够的Api和扫描方式等等,不过优点是它比Spring要快很多,而 ...
- 08-jQuery的位置信息
Query的位置信息跟JS的client系列.offset系列.scroll系列封装好的一些简便api. 一.宽度和高度 获取宽度 .width() 描述:为匹配的元素集合中获取第一个元素的当前计算宽 ...
- Centos yum 修改为阿里源以及常用的命令
1.备份 mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup 2.下载新的CentOS-Base ...
- mybatis分页查询,SqlServer 2008 查询速度很慢
一个业务场景,需要进行union查询: 查询速度非常慢,大概要37秒: 直接复制sql在数据库客户端执行,速度很快,由此可知是mybatis的原因,在网上搜索,可以配置fetchSize=" ...
- Android RxJava zip 操作符
不说话,直接举例 // zip 2 observables Observable.zip(Observable.just(0), Observable.just(0), BiFunction { t1 ...
- 使用 maven-assembly-plugin 打包项目
此种方式可避免resource节点对compile阶段的影响,compile阶段会读取resource节点的信息但是不会读取assembly的配置文件 1. pom文件 <?xml versio ...
- 关于No mapping found for HTTP request with URI...
当你看到这篇博客,说明你已经像我一样快疯了!但是还好..找到了!!! 网上的那些东西真心看了更闹心,因为还没解决... 原因一.访问路径确实错了,导致Dispatcher找不到给你传达的地方,修改下领 ...
- Data - 关于大数据
历史与趋势 大数据的前世今生:诞生.发展.未来? 如何利用数据赚钱?大数据价值变现的10种商业模式及利弊分析 10大行业大数据应用痛点及解决策略 大数据凉了?不,流式计算浪潮才刚刚开始 概念与定义 关 ...
- BOM 浏览器对象模型
1.window对象模型:(操作浏览器) 它既是ECMAScript规定的global对象,又是javascript访问浏览器窗口的一个接口 系统对话框:这些对话框有操作系统/浏览器设置决定,css不 ...
- VSCode配置Git随记
VSCode配置Git随记 2018年05月29日 10:14:24 Dominic- 阅读数:4096 vscode中对git进行了集成,很多操作只需点击就能操作,无需写一些git指令. 不过这 ...