多个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;
}
}