文章目录
JavaEE三层架构
- JavaEE三层架构:表现层、业务层、持久层
(1)表现层:接收和处理请求!表现层的模型:MVC模型
(2)业务层:处理程序业务需求
(3)持久层:对数据库操作,即对数据库的CRUD
MVC模型
- MVC模型不单单是JavaEE是特有的:很多编程语言都在使用MVC模型
- 在JavaEE中:MVC是一个表现层的模型
(1)M:Model:模型:作用是封装数据:实体类可以作为模型
(2)V:View:视图:作用是展示数据:HTML/JSP可以作为视图:HTML作为静态资源;JSP作为动态资源
(3)C:Controller:控制器:作用是控制程序流转的:Servlet/Filter作为控制器
Servlet和Filter
-
相同点:
(1) 它们都有三个生命周期方法:初始化、销毁和核心方法(service、doFilter)
(2) 它们的核心方法都有HttpServletRequest和HttpServletResponse对象:所以它们都能处理请求
(3) 它们都是单例对象:即一个应用只有一个对象 -
不同点:
(1) 对象创建时间点不一样:Servlet默认在第一次请求时被创建,但也可以通过配置在应用被加载的时候创建;Filter在应用被加载的时候就被创建
(2) Filter不是一个资源,不能通过地址栏访问;Servlet是一个资源,可以通过地址栏访问
(3) Servlet能够做的Filter都能做,但是Filter能做的Servlet不一定能做:因为Filter#doFilter()比Servlet#service()方法多一个参数
-
纯粹的Servlet时代,访问Servlet中有很多问题:大量的if…else if…else等等判断
-
那么我们的解决方法:抽取BaseServlet类,但是BaseServlet中有个问题:访问路局Url中必须提供method的请求参数,请求参数的值为Servlet中的方法名
-
解决上面问题的方案:可以使用配置文件
<a href=".../user/Servlet/addUser123">添加用户</a>
// 配置文件中添加一个属性:method
<servlet name="AServlet1111" class="com.ycom.servlet.AServlet" url="addUser123" method="addUser"></servlet>
<servlet-pattern name="AServlet1111" url="/user/AServlet"></servet-pattern>
public class AServlet extends HttpServlet{
public void addUser(HttpServletRequest request, HttpServletResponse response) {
}
}
将url与java代码解耦
搭建Struts2开发环境
-
第一步
:添加jar包
-
第二步
:创建struts2的核心配置文件
:在src根目录下创建struts.xml文件:配置文件的位置与名称都是可以改变的:但是没有特殊情况使用默认的即可
-
第三步
:在web.xml文件中配置struts2的核心过滤器
<!--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>
Struts2的入门案例(☆☆☆☆☆)
- 第一步:导jar包
- 第二步:创建struts2的核心配置文件: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="p1" extends="struts-default">
<action name="" class="" method=""></action>
</package>
</struts>
(1)action标签的作用:建立url与动作类的关系
(2)动作名称
:请求资源的名称
(3)动作类
:就是处理用户请求的类
(4)动作方法
:动作类中处理请求的方法
- 第三步:创建动作类,实现动作方法
package com.ycom.struts2.action;
// 动作类: 用于处理用户请求的类
public class HelloAction {
// 动作方法: 动作类中处理用户请求的方法
public String sayHello() {
System.out.println("我是动作类中的动作方法: 我被执行了");
return "success";
}
}
- 第四步:完善url与动作类的关系配置
<?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="p1" extends="struts-default">
<action name="hello" class="com.ycom.struts2.action.HelloAction" method="sayHello">
<result name="success" type="dispatcher">/success.jsp</result>
</action>
</package>
</struts>
<!--
action标签: 动作标签:建立url与动作类的联系
name属性: 动作名称:url中的请求部分:例如http://localhost:8080/struts2demo001/hello中的hello就是name的值
class属性: 动作类:动作类的权限定类名
method属性: 动作方法:动作类中动作方法的方法名称
######################################################################################
result标签:动作类如何处理请求的结果:例如转发、重定向等等
name属性:关联资源的名称
type属性:对请求结果的处理方式:转发、重定向等等
-->
- 第五步:在web.xml文件中配置核心过滤器
- 第六步:从浏览器中访问
Struts2处理请求的流程
- 动作类对象是多例的:即每个线程都会创建自己的动作类对象:所有动作类对象没有线程安全问题:注意:Servlet实例对象是单例的,存在线程安全问题
Struts2处理请求的原理
- 程序员每天要做的工作就是
User created
部分
(1)写配置文件:在Struts2阶段的主要工作就是写配置文件了☆☆☆☆☆
(2)写动作类:处理请求:在JavaWeb阶段也需要些处理请求,即Servlet
(3)写结果视图JSP:在JavaWeb阶段同样也需要些JSP页面 - Struts2已经帮我们解决了POST请求中的中文乱码问题,但是没有解决GET请求的中文乱码问题
Struts2的配置文件
- Struts2的配置文件主要有6个:
(1) default.properties
(2) struts-default.xml
(3) struts-plugin.xml
(4) struts.xml
(5) struts.properties
(6) web.xml - 6个配置文件的加载顺序如下:
加载顺序 | 配置文件名 | 所在位置 | 说明 |
---|---|---|---|
1 | default.properties | struts-core-2.3.15.3.jar\org\apache\struts2 | 不能修改(因为在jar包中) |
2 | struts-default.xml | struts-core-2.3.15.3.jar | 不能修改(因为在jar包中) |
3 | struts-plugin.xml | 在struts2提供的插件jar包中 | 不能修改(因为在jar包中) |
4 | struts.xml | 我们的应用中 | 可以修改: 主要的配置文件 |
5 | struts.properties | 我们的应用中 | 可以修改 |
6 | web.xml | 我们的应用中 | 可以修改: 可以给过滤器配置参数 |
- 当多个配置文件中,有相同参数,后加载的会把前面的值给覆盖了:默认拦截的请求后缀是.action或不带任何后缀的:现在在核心配置文件中修改为拦截的请求后缀为.do或.xy或不带任何后缀
- default.properties文件中的几个主要的参数说明:这个文件里面主要是开关类属性
struts.action.extension=action,,:struts2默认的拦截请求的后缀:默认是.action或没有后缀:可以在核心配置文件struts.xml中进行覆盖
struts.enable.DynamicMethodInvocation = false:动态方法调用:默认是不允许
struts.devMode = false:开发者模式:默认值关闭的:打开后能实时加载配置文件
- struts-default.xml配置文件的相关说明
Struts2核心配置文件中的标签
标签:struts
- 根标签
标签:package
- 作用:给访问的action进行分包管理:把配置文件按照面向对象的思想来管理
- 属性:
属性名 | 说明 |
---|---|
name | 指定包名,必须写,并且必须唯一 |
extends | 1. 指定当前包的父包!子包自动具备父包所定义的配置! 2. 我们的包一般都继承struts-default包:该包在struts-default.xml配置文件中定义着 3. 如果不继承该包,那么就不能使用struts2的核心功能 |
abstract | 1. 把当前包声明为抽象包! 2. 抽象包的作用就是用来被子包继承的:里面一般都是定义一些公共的配置! 3. 注意:只有没有action标签的包才能被定义为abstract包 |
namespace | 1. 指定当前包的名称空间! 2. 它可以让我们的访问URL模块化! 3. 当我们指定了该属性,那么访问URL就变成了:名称空间/action标签的name属性值 4. 名称空间的写法:第一个字符必须是/,后面紧跟的字符必须是一个字母,其余内容可以是字母也可以是数字 5. 名称空间的默认值为:"",即空字符串 |
标签:action
- 作用:建立
动作名称
、动作类
和动作方法
的对应关系 - 属性:
属性名 | 说明 |
---|---|
name | 1. 指定动作名称 2. 不同的action标签中的该属性值不能相同 3. 该属性必须有 |
class | 1. 指定动作类的权限定类名 2. 有默认值:com.opensymphony.xwork2.ActionSupport |
method | 1. 指定动作方法名称 2. 有默认值:execute |
动作类的三种创建方式
第一种方式:无侵入式
- 这种方式在实际项目开发中应用的并不是很多!!!
- Struts2的核心配置文件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>
<!-- 建立动作名称、动作类、动作方法的对应关系 -->
<package name="user" extends="struts-default" namespace="/user">
<action name="add_user" class="com.ycom.struts2.action.UserAction" method="addUser">
<result name="success" type="dispatcher">/success.jsp</result>
</action>
<action name="del_user" class="com.ycom.struts2.action.UserAction" method="delUser">
<result name="success" type="dispatcher">/success.jsp</result>
</action>
<action name="update_user" class="com.ycom.struts2.action.UserAction" method="updateUser">
<result name="success" type="dispatcher">/success.jsp</result>
</action>
<action name="find_user" class="com.ycom.struts2.action.UserAction" method="findUser">
<result name="success" type="dispatcher">/success.jsp</result>
</action>
</package>
</struts>
- 动作类的实现代码
package com.ycom.struts2.action;
// 动作类
public class UserAction {
public String addUser() {
System.out.println("添加用户!");
return "success";
}
public String delUser() {
System.out.println("删除用户!");
return "success";
}
public String updateUser() {
System.out.println("修改用户!");
return "success";
}
public String findUser() {
System.out.println("查询用户!");
return "success";
}
}
- 发起请求的页面代码:JS页面
<%@ 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>
<a href="${pageContext.request.contextPath}/user/add_user">添加用户</a> <br>
<a href="${pageContext.request.contextPath}/user/del_user">删除用户</a> <br>
<a href="${pageContext.request.contextPath}/user/update_user">更新用户</a> <br>
<a href="${pageContext.request.contextPath}/user/find_user">查询用户</a> <br>
</body>
</html>
- 在浏览器中进行访问:
http://localhost:8080/struts2demo002/user.jsp
- 得到页面如下
- 执行过程
第二种方式:实现Action接口方式
- 这种方式在实际项目开发中应用的并不是很多!!!
- 我们自定义的动作类要实现Action接口
- 动作类的实现代码:
package com.ycom.struts2.action;
import com.opensymphony.xwork2.Action;
/**
* 动作类 实现 Action接口
* 必须实现Action#execute()方法
* @author Administrator
*
*/
public class UserAction implements Action{
@Override
public String execute() throws Exception {
System.out.println("默认的动作方法");
return SUCCESS; // Action接口中的常量
}
public String addUser() {
System.out.println("添加用户");
return SUCCESS;
}
public String delUser() {
System.out.println("删除用户");
return SUCCESS;
}
public String updateUser() {
System.out.println("更新用户");
return SUCCESS;
}
public String findUser() {
System.out.println("查询用户");
return SUCCESS;
}
}
- Struts2的核心配置文件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>
<!-- 建立动作名称、动作类、动作方法的对应关系 -->
<package name="user" extends="struts-default" namespace="/user">
<action name="add_user" class="com.ycom.struts2.action.UserAction" method="addUser">
<result name="success" type="dispatcher">/success.jsp</result>
</action>
<action name="del_user" class="com.ycom.struts2.action.UserAction" method="delUser">
<result name="success" type="dispatcher">/success.jsp</result>
</action>
<action name="update_user" class="com.ycom.struts2.action.UserAction" method="updateUser">
<result name="success" type="dispatcher">/success.jsp</result>
</action>
<action name="find_user" class="com.ycom.struts2.action.UserAction" method="findUser">
<result name="success" type="dispatcher">/success.jsp</result>
</action>
<!-- 使用默认的动作方法的配置 -->
<action name="default_action_method" class="com.ycom.struts2.action.UserAction">
<result name="success" type="dispatcher">/success.jsp</result>
</action>
</package>
</struts>
- 请求页面代码
<%@ 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>
<a href="${pageContext.request.contextPath}/user/add_user">添加用户</a> <br>
<a href="${pageContext.request.contextPath}/user/del_user">删除用户</a> <br>
<a href="${pageContext.request.contextPath}/user/update_user">更新用户</a> <br>
<a href="${pageContext.request.contextPath}/user/find_user">查询用户</a> <br>
<a href="${pageContext.request.contextPath}/user/default_action_method">默认的动作方法</a> <br>
</body>
</html>
- 效果如下
第三种方式:继承ActionSupport类
- 在实际项目开发中,主要以这种方式为主!!!
- 继承ActionSupport类的方式与实现Action接口的方式完全一样:只不过实现Action接口的类必须实现Action#execute()的抽象方法;继承ActionSupport这个类则不用:因为ActionSupport这个类已经实现了Action接口
action的三种访问方式
第一种方式:全匹配访问方式
<a href="${pageContext.request.contextPath}/user/add_user">添加用户</a> <br>
<a href="${pageContext.request.contextPath}/user/del_user">删除用户</a> <br>
<a href="${pageContext.request.contextPath}/user/update_user">更新用户</a> <br>
<a href="${pageContext.request.contextPath}/user/find_user">查询用户</a> <br>
<a href="${pageContext.request.contextPath}/user/default_action_method">默认的动作方法</a> <br>
====================================================================================
核心配置文件:
<package name="user" extends="struts-default" namespace="/user">
<action name="add_user" class="com.ycom.struts2.action.UserAction" method="addUser">
<result name="success" type="dispatcher">/success.jsp</result>
</action>
<action name="del_user" class="com.ycom.struts2.action.UserAction" method="delUser">
<result name="success" type="dispatcher">/success.jsp</result>
</action>
<action name="update_user" class="com.ycom.struts2.action.UserAction" method="updateUser">
<result name="success" type="dispatcher">/success.jsp</result>
</action>
<action name="find_user" class="com.ycom.struts2.action.UserAction" method="findUser">
<result name="success" type="dispatcher">/success.jsp</result>
</action>
<!-- 使用默认的动作方法的配置 -->
<action name="default_action_method" class="com.ycom.struts2.action.UserAction">
<result name="success" type="dispatcher">/success.jsp</result>
</action>
</package>
第二种方式:基本通配符访问方式
- 通配符就是:*
- 动作类代码
package com.ycom.struts2.action;
import com.opensymphony.xwork2.ActionSupport;
// 动作类
public class UserAction extends ActionSupport {
public String addUser() {
System.out.println("添加用户!");
return SUCCESS;
}
public String delUser() {
System.out.println("删除用户!");
return SUCCESS;
}
public String updateUser() {
System.out.println("更新用户!");
return SUCCESS;
}
public String findUser() {
System.out.println("查询用户!");
return SUCCESS;
}
}
- Struts2核心配置文件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>
<!-- 建立动作名称、动作类、动作方法的对应关系 -->
<package name="user" extends="struts-default">
<!--方式方式使用的是通配符-->
<action name="*" class="com.ycom.struts2.action.UserAction" method="{1}">
<result name="success" type="dispatcher">/success.jsp</result>
</action>
</package>
</struts>
- 请求页面代码:
<%@ 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>
<a href="${pageContext.request.contextPath}/addUser">添加用户</a> <br>
<a href="${pageContext.request.contextPath}/delUser">删除用户</a> <br>
<a href="${pageContext.request.contextPath}/updateUser">更新用户</a> <br>
<a href="${pageContext.request.contextPath}/findUser">查询用户</a> <br>
</body>
</html>
第二种方式:高级通配符访问方式
- 需求:现在有两个模块:用户模块与商品模块:两个模块都有CRUD操作!能否使用一个配置就可以配置这两个模块?需要使用高级通配符访问
- 要求:对请求URL的格式有要求
- 用户动作类
package com.ycom.struts2.action;
import com.opensymphony.xwork2.ActionSupport;
// 动作类
public class UserAction extends ActionSupport {
public String addUser() {
System.out.println("添加用户!");
return SUCCESS;
}
public String delUser() {
System.out.println("删除用户!");
return SUCCESS;
}
public String updateUser() {
System.out.println("更新用户!");
return SUCCESS;
}
public String findUser() {
System.out.println("查询用户!");
return SUCCESS;
}
}
- 商品动作类
package com.ycom.struts2.action;
import com.opensymphony.xwork2.ActionSupport;
// 动作类
public class GoodsAction extends ActionSupport {
public String addGoods() {
System.out.println("添加商品!");
return SUCCESS;
}
public String delGoods() {
System.out.println("删除商品!");
return SUCCESS;
}
public String updateGoods() {
System.out.println("更新商品!");
return SUCCESS;
}
public String findGoods() {
System.out.println("查询商品!");
return SUCCESS;
}
}
- 请求页面
<%@ 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>
<a href="${pageContext.request.contextPath}/add_User">添加用户</a> <br>
<a href="${pageContext.request.contextPath}/del_User">删除用户</a> <br>
<a href="${pageContext.request.contextPath}/update_User">更新用户</a> <br>
<a href="${pageContext.request.contextPath}/find_User">查询用户</a>
<hr>
<a href="${pageContext.request.contextPath}/add_Goods">添加商品</a> <br>
<a href="${pageContext.request.contextPath}/del_Goods">删除商品</a> <br>
<a href="${pageContext.request.contextPath}/update_Goods">更新商品</a> <br>
<a href="${pageContext.request.contextPath}/find_Goods">查询商品</a>
</body>
</html>
- Struts2核心配置文件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>
<!-- 建立动作名称、动作类、动作方法的对应关系 -->
<package name="user" extends="struts-default">
<!-- 用带下划线的通配符将目标分割成两个单词,
1) add_User分割成add与User ==> {2}Action就是UserAction; {1}{2}就是addUser
2) find_Goods分割成find与Goods ==> {2}Action就是GoodsAction; {1}{2}就是findGoods
-->
<action name="*_*" class="com.ycom.struts2.action.{2}Action" method="{1}{2}">
<result name="success" type="dispatcher">/success.jsp</result>
</action>
</package>
</struts>
- 在实际开发中使用通配符的访问方式较多
第三种方式:动态方法调用
- 前提:必须打开动态方法调用的开关:在 default.properties文件中动态方法调用是关闭的
- 在Struts2核心配置文件中将该参数设置为true,即开启动态方法调用
<?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="p1" extends="struts-default">
<!-- 不写method的属性,同时开启了动态方法调用 -->
<action name="user" class="com.ycom.struts2.action.UserAction">
<result name="success" type="dispatcher">/success.jsp</result>
</action>
<!-- 不写method的属性,同时开启了动态方法调用 -->
<action name="goods" class="com.ycom.struts2.action.GoodsAction">
<result name="success" type="dispatcher">/success.jsp</result>
</action>
</package>
</struts>
- 请求页面
<%@ 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>
<!-- action的访问方式:动态方法调用对请求格式的要求 -->
<a href="${pageContext.request.contextPath}/user!addUser">添加用户</a> <br>
<a href="${pageContext.request.contextPath}/user!delUser">删除用户</a> <br>
<a href="${pageContext.request.contextPath}/user!updateUser">更新用户</a> <br>
<a href="${pageContext.request.contextPath}/user!findUser">查询用户</a>
<hr>
<a href="${pageContext.request.contextPath}/goods!addGoods">添加商品</a> <br>
<a href="${pageContext.request.contextPath}/goods/delGoods">删除商品</a> <br>
<a href="${pageContext.request.contextPath}/goods/updateGoods">更新商品</a> <br>
<a href="${pageContext.request.contextPath}/goods/findGoods">查询商品</a>
</body>
</html>
获取request对象的方式
- 动作类是处理请求的类,那么肯定存在request对象与response对象,只不过这两个对象不是通过动作方法的参数传递进来的
- 有三种方式在Struts2中可以获取request对象
第一种方式:ServletActionContext
- 动作类代码
package com.ycom.struts2.action;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.ActionSupport;
// 动作类
public class GetRequestAction extends ActionSupport {
// 动作方法
public String getRequest() {
// 通过ServletActionContext类获取到request对象
HttpServletRequest request = ServletActionContext.getRequest();
// 通过ServletActionContext类获取到response对象
HttpServletResponse response = ServletActionContext.getResponse();
// 获取请求方式
String method = request.getMethod();
System.out.println("请求方式: " + method);
System.out.println("request: " + request);
System.out.println("response: " + response);
System.out.println("============================");
return SUCCESS;
}
}
- 核心配置文件
<?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>
<!-- 建立动作名称、动作类、动作方法的对应关系 -->
<package name="p1" extends="struts-default">
<action name="demo" class="com.ycom.struts2.action.GetRequestAction" method="getRequest">
<result name="success" type="dispatcher">/success.jsp</result>
</action>
</package>
</struts>
- 请求页面
<%@ 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>
<a href="${pageContext.request.contextPath}/demo">GET请求</a>
<form action="${pageContext.request.contextPath}/demo" method="post">
<input type="submit" value="POST请求" />
</form>
</body>
</html>