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