Struts2 框架总结(二) :多个Action方法配置和访问servlet API

多个Action方法配置

一个actiona可能有多个功能,如果再xml里写多个action标签会显得多余,可以通过通配符配置多个action方法

public String login(){
		//这里应该调用service的验证登录功能,为了方便演示,在这里就固定验证了
		//如果账号是admin,密码是ok,就登录成功,否则登录失败
		if(this.username.equals("admin")&&this.password.equals("ok")){
			return "success";
		}else{
			return "fail";
		}

	}
	public String register(){
		System.out.println("注册");
		
		return "reg";
		
	}

打开struts.xml,action标签:*代表通配符,将来method会根据‘*’找到对应的方法

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
    "http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
	<!-- 
	name:可选属性,无特别含义,表示为哪个包服务
	namespace:发出请求的时候地址要带上namespace,这样其他的action也有这个方法就不不会导致歧义
	extends:默认继承"stuts-default"包
	 -->
   <package name="login" namespace="/login" extends="struts-default"> 	
   		<!-- 
   			name:请求具体路径,前面跟上/namespace
   			class:指定action所在的类
   			method:action类中指定的方法
   		 -->	
   		<action name="login_*" class="sdibt.fly.action.LoginAction" method="{1}"> 		
   			<!-- 
   			name:success,就跳向login_success.html
   			type:默认是请求dispatcher(请求跳转),redirect是页面重定向
   			 -->
   			<result name="success" type="dispatcher">/login_success.html</result>
   			<result name="reg" >/reg_success.html</result>
   			<result name="fail" type="redirect" >/login_fail.html</result>
   		</action>
   
   </package>

</struts>


Action访问servelt API

与servlet解耦的方式:
1.使用ActionContext获取作用域
public String register(){
		//获取action上下文,好比是一个map
		ActionContext ctx = ActionContext.getContext();
		//获取request
		Map request = (Map) ctx.get("request");
		//获取session
		Map<String, Object> session = ctx.getSession();
		//获取application
		Map application = (Map) ctx.getApplication();
		
		//往作用域存放值
		request.put("username", "小明");
		session.put("username", "小李");
		application.put("username", "小王");
		
		
		return "reg";
		
	}

jsp界面

<%@ 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>

request作用域:${requestScope.username}
session作用域:${sessionScope.username}
application作用域:${applicationScope.username}

</body>
</html>

2.让Action实现三个接口RequestAware,SessionAware, ApplicationAware
重写set方法,要有 request,session,application属性,并且在set方法赋值
package sdibt.fly.action;

import java.util.Map;

import org.apache.struts2.interceptor.ApplicationAware;
import org.apache.struts2.interceptor.RequestAware;
import org.apache.struts2.interceptor.SessionAware;


public class LoginAction implements RequestAware,SessionAware,ApplicationAware{
	//如果实现三个接口的话要写上这三个属性
	private Map<String, Object> request;
	private Map<String, Object> session;
	private Map<String, Object> application;
	
	
	private String username;//请求的账号
	private String password;//请求的密码
	public String login(){
		//这里应该调用service的验证登录功能,为了方便演示,在这里就固定验证了
		//如果账号是admin,密码是ok,就登录成功,否则登录失败
		if(this.username.equals("admin")&&this.password.equals("ok")){
			return "success";
		}else{
			return "fail";
		}

	}
	public String register(){
		//往作用域存放值
		request.put("username", "小明");
		session.put("username", "小李");
		application.put("username", "小王");
		
		return "reg";
		
	}
	
	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;
	}
	@Override
	public void setApplication(Map<String, Object> arg0) {
		// TODO Auto-generated method stub
		this.application=arg0;
	}
	@Override
	public void setSession(Map<String, Object> arg0) {
		// TODO Auto-generated method stub
		this.session=arg0;
	}
	@Override
	public void setRequest(Map<String, Object> arg0) {
		// TODO Auto-generated method stub
		this.request=arg0;
	}
	
}

与servlet耦合的方式:
package sdibt.fly.action;

import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

import org.apache.struts2.ServletActionContext;

public class LoginAction {

	private String username;//请求的账号
	private String password;//请求的密码
	public String login(){
		//这里应该调用service的验证登录功能,为了方便演示,在这里就固定验证了
		//如果账号是admin,密码是ok,就登录成功,否则登录失败
		if(this.username.equals("admin")&&this.password.equals("ok")){
			return "success";
		}else{
			return "fail";
		}

	}
	public String register(){
		//获取request
		HttpServletRequest request = ServletActionContext.getRequest();
		//获取session
		HttpSession session = request.getSession();
		//获取application
		ServletContext application = request.getServletContext();	
		
		request.setAttribute("username", "小明");
		session.setAttribute("username", "小李");
		application.setAttribute("username", "小赵");
		return "reg";
		
	}
	
	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;
	}	
}




  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值