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

一、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>

猜你喜欢

转载自blog.csdn.net/openbox2008/article/details/86591349