Java轻量级MVC框架Struts2 2.5详解(3)Action访问ServletApi、获取参数

本文详细介绍了在Struts2框架中,Action如何访问ServletAPI的四种方法,包括实现感知接口、使用ServletActionContext工具类、利用ActionContext工具类及配置相关文件。同时,还探讨了Action获取请求参数的三种方式,分别通过属性注入和模型驱动实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、Action如何访问ServletApi

1.让Action类实现感知接口:
ServletRequestAware:感知HttpServletRequest对象;

ServletResponseAware:感知HttpServletResponse对象;

ServletSessionAware:感知HttpSession对象;但这种方式与ServletApi耦合严重,不推荐使用

public class UserAction extends ActionSupport implements ServletRequestAware, ServletResponseAware {

	private HttpServletRequest request;
	private HttpServletResponse response;

	//1.方式1:实现感知接口
	public void setServletResponse(HttpServletResponse response) {
		this.response = response;
	}

	public void setServletRequest(HttpServletRequest request) {
		this.request = request;
	}

	public String list() throws Exception {
    //获取到请求参数对对象

		String name = request.getParameter("name");
		System.out.println("name");
		request.setAttribute("name", name);
    		
		return "list";
	}
}

2.通过ServletActionContext工具类

通过ServletActionContext类中的静态方法,得到Servlet相关的Api对象,操作和理解非常简单.,该方式方便,虽依然有耦合,但开发中比较多人使用。

public class UserAction extends ActionSupport {

	//2.方式2:通过ServletActionContext工具类
	public String save() throws Exception {
		ServletActionContext.getRequest().setAttribute("name", "马蓉");		
		return "list";
	}

 
3.通过ActionContext工具类:

ActionContext:从字面上分析,表示Action的上下文对象  ,ActionContext封装每一次请求的相关信息。

ActionContext  ctx = ActionContext.getContext();

在ActionContext中把request,session,application三大作用域都作为Map对象.

1):获取请求参数.

  HttpParameters httpParameters = ctx.getParameters();
  Parameter username = httpParameters.get("username");  

2):操作request作用域:

   ctx.put(String key,Object value);      Object val = ctx.get(String name);

3):操作session作用域:

   Map<String,Object> session = ctx.getSession(); 接下来就是操作Map对象

4):操作servletContext(application)作用域:

   Map<String,Object> app = ctx.getApplication();

public class UserAction extends ActionSupport {
	
	//方式3:通过ActionContext工具类,将请求和响应数据封装到一个MAP中
	public String update() throws Exception {

		//3.1.通过类的静态方法,获到ActionContext对象
		ActionContext ctx=ActionContext.getContext();
		
		//3.2.获取请求参数:HttpParameters类其实就是一个Map,如:Map<String, Parameter>,将表单中的所有数据都放在Map中
		HttpParameters httpParameters = ctx.getParameters();
		//将参数一个个的取出来
		Parameter username = httpParameters.get("username");
		Parameter oldpassword = httpParameters.get("oldpassword");
		
		System.out.println(username +":"+oldpassword);		
		
		//3.3.操作request作用域
		ctx.put("username", "周星");
		
		//3.4.操作session作用域
		Map<String, Object> session = ctx.getSession();
		session.put("color", "red");
		
		//3.5.操作application作用域
		Map<String, Object> application = ctx.getApplication();
		application.put("gobal", "全局参数");
		
		return "list";
	}	
}

 4.相关其它配置文件

1)struts.xml文件

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
    "http://struts.apache.org/dtds/struts-2.5.dtd">
<struts>

	<!-- 1.struts2默认常量修改,不能直接修改default.propertis中的常量 -->
	<constant name="struts.action.extension" value="action,do,neld,"></constant>
	<constant name="struts.serve.static.browserCache" value="false"></constant>
	<constant name="struts.devMode" value="true"></constant>
	<constant name="struts.enable.DynamicMethodInvocation" value="true"></constant>

	<!-- 2.主struts.xml文件,引用所有包中的struts-xxx.xml文件 -->
	<include file="org/openbox/user/struts-user.xml"></include>

</struts>

2)struts-user.xml文件

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
    "http://struts.apache.org/dtds/struts-2.5.dtd">
<struts>
	<!-- 2.创建struts2包配置文件[package,action,result] -->
	<package name="actionpkg" namespace="/" extends="struts-default" >	
	<!-- 3.在一个Action中,有多个方法时,如何调用:使用*通配符,{1}表示第1个*的参数:注意类名首字母大写, *的具体值在URL地址栏中输入-->		
		<action name="*_*" class="org.openbox.user.{1}Action" method="{2}">
     		<result name="list">
				<param name="location">/WEB-INF/views/user.jsp</param>
			</result>
			<allowed-methods>list,save,delete,update</allowed-methods>
		</action>		
	</package>
</struts>

3)user.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>
从URL传过来的参数:${name}<br/>
<br/>
request作用域:${username}
<br/>
session作用域:${color}
<br/>
application作用域:${gobal}
</body>
</html>

 访问结果:

二、Action如何获取请求参数

1.Action获取请求参数有3种方式,归功于拦截器(ParametersIntercepter):

第一种:Action本身作为Model对象,通过setter方法封装(属性注入)

第二种:创建独立Model对象,页面通过ognl表达式封装(属性注入)

第三种:使用ModelDriven接口,对请求数据进行封装(模型驱动)

2.方式1:Action本身作为Model对象,通过setter方法封装(属性注入)

public class ChangPassAction extends ActionSupport {

	private static final long serialVersionUID = 1L;

	//第1种方法:通过设置参数属性提供set(),get()方法
	private String newpassword;
	private String confirmpassword;

	//并提供set(),get()方法
	public String getNewpassword() {
		return newpassword;
	}
	public void setNewpassword(String newpassword) {
		this.newpassword = newpassword;
	}
	public String getConfirmpassword() {
		return confirmpassword;
	}

	public void setConfirmpassword(String confirmpassword) {
		this.confirmpassword = confirmpassword;
	}

    public String changePassword() throws Exception {

		//1.获取表单参数,第2种方式:通过设置参数属性提供set(),get()方法
		System.out.println("新密码:" + newpassword +"  确认密码:"+ confirmpassword);
		return "success";
	}
}

相应的jsp表单文件

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>修改密码</title>
</head>
<body>
<form action="/changepassword" method="post">
新密码:<input name="newpassword" /><br/>
确认新密码:<input name="confirmpassword" /><br/>
<input type="submit" value="修改">
</form>
</body>
</html>

3.方式2:创建独立Model对象,页面通过ognl表达式语法来封装对象.

1)创建User对象,定义字段并提供set,get方法

package org.openbox.user;
public class User {

	private String username;
	private String password;
	
	public String getUsername() {
		return username;
	}
	public void setUsername(String username) {
		this.username = username;
	}
	public String getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}		
}

2)Action文件

package org.openbox.user;
import com.opensymphony.xwork2.ActionSupport;

public class ChangPassAction extends ActionSupport {

	private static final long serialVersionUID = 1L;
	//3.第3种方法:将参数封装成一个model对象
    //这个对象中的字段都提供字段的set(),get()方法,并提供set(),get()方法

	private User u;		
	public User getU() {
		return u;
	}
	public void setU(User u) {
		this.u = u;
	}

	public String changePassword() throws Exception {		
		//3.通过model对象中的set(),get()方法获取数据
		System.out.println(u.getUsername() +"   "+ u.getPassword());		
		return "success";
	}
}

3)jsp文件,通过ngol表示数据

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>修改密码</title>
</head>
<body>
ngol表示法:

<form action="/changepassword" method="post">
    账号:<input name="u.username" /><br/>
    密码:<input name="u.password" /><br/>
<input type="submit" value="修改">

</form>
</body>
</html>

 

 

 

 

 

 

<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.5//EN" "http://struts.apache.org/dtds/struts-2.5.dtd"> <struts> <constant name="struts.devMode" value="true" /> <package name="default" namespace="/" extends="struts-default"> <action name="helloworld" class="com.mytest.HelloWorldAction"> <result> /result.jsp </result> </action> </package> <package name="LoginForm" extends="struts-default"> <action name="login" class="com.mytest.LoginAction" method="execute"> <result> /login.jsp </result> </action> </package> </struts> <!--1.使用 struts2.5.16 版本 2.lib 文件夹下放置:工程所需jar包 3.xml标签库为远程获取,路径:http://struts.apache.org/dtds/struts-2.5.dtd 可设置为本地【xml输入语法快捷提示】,就不用远程获取了:window-->preference-->输入Catalog-->xml下的Catalog-->Add-->location:解压缩struts-core-2.5.16.jar 后,文件struts-2.5.dtd文件路径。 4.设置开发者模式: <constant name="struts.devMode" value="true" /> <constant name="struts.i18n.encoding" value="utf-8" /> 每次HTTP请求系统都重新加载资源文件,有助于开发 5.struts配置文件改动后,是否重新加载 <constant name="struts.configuration.xml.reload" value="true" /> 6.查看源码:Build path 后的类库中,奶瓶图标找到struts-core-2.5.16.jar 右键-->properties-->java Source Attachment-->External location :源码路径 7.查看文档API:Build path 后的类库中,奶瓶图标找到struts-core-2.5.16.jar 右键-->properties-->javadoc location :输入网址 或选择源码DOC目录 8.拦截器:web.xml 配置拦截器<filter> struts2.5的filter-class 与struts2.5以前版本有所不同 <!-- 浏览器访问 http://localhost:8080/MyWeb/helloworld --> --> <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0"> <display-name>Struts 2</display-name> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> <!-- 配置核心拦截器 --> <filter> <filter-name>struts2</filter-name> <!-- Filter的实现类 struts2.5 --> <filter-class> org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter </filter-class> </filter> <filter-mapping> <!-- 拦截所有的url --> <filter-name>struts2</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> </web-app>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值