Java表现层之Struts2:01_Struts2入门

本文介绍了JavaEE的三层架构和MVC模型,重点讲解了Struts2的入门,包括如何搭建开发环境、创建action配置、处理请求流程及原理。详细阐述了Struts2的配置文件、动作类的三种创建方式以及action的访问方式,并提供了获取request对象的示例。
摘要由CSDN通过智能技术生成


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个配置文件的加载顺序如下:
加载顺序配置文件名所在位置说明
1default.propertiesstruts-core-2.3.15.3.jar\org\apache\struts2不能修改(因为在jar包中)
2struts-default.xmlstruts-core-2.3.15.3.jar不能修改(因为在jar包中)
3struts-plugin.xml在struts2提供的插件jar包中不能修改(因为在jar包中)
4struts.xml我们的应用中可以修改: 主要的配置文件
5struts.properties我们的应用中可以修改
6web.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指定包名,必须写,并且必须唯一
extends1. 指定当前包的父包!子包自动具备父包所定义的配置!
2. 我们的包一般都继承struts-default包:该包在struts-default.xml配置文件中定义着
3. 如果不继承该包,那么就不能使用struts2的核心功能
abstract1. 把当前包声明为抽象包!
2. 抽象包的作用就是用来被子包继承的:里面一般都是定义一些公共的配置!
3. 注意:只有没有action标签的包才能被定义为abstract包
namespace1. 指定当前包的名称空间!
2. 它可以让我们的访问URL模块化!
3. 当我们指定了该属性,那么访问URL就变成了:名称空间/action标签的name属性值
4. 名称空间的写法:第一个字符必须是/,后面紧跟的字符必须是一个字母,其余内容可以是字母也可以是数字
5. 名称空间的默认值为:"",即空字符串

在这里插入图片描述

标签:action

  • 作用:建立动作名称动作类动作方法的对应关系
  • 属性:
属性名说明
name1. 指定动作名称
2. 不同的action标签中的该属性值不能相同
3. 该属性必须有
class1. 指定动作类的权限定类名
2. 有默认值:com.opensymphony.xwork2.ActionSupport
method1. 指定动作方法名称
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>

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值