1 Struts2中获取Action的方式:
可以通过继承ActionSupport的方式获取;
2 Struts2中常用 的传递参数方式:
a:可以通过属性传递参数,表单的属性名称和javabean的属性名称相对应,在Action添加对应的属性,并设置get和set方法即可;
b:可以通过javabean传递参数,Action中设置javabean类型的属性,添加get和set方法,表单中使用,对象.属性的形式作为属性名称;
3 struts2访问servletAPI:
访问假的API(用Map模拟的ServletAPI):
实例化ActionContext,由此获取;
package com.st.action;
import java.util.HashMap;
import java.util.Map;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
import com.st.user.User;
public class LoginAction extends ActionSupport {
private Map<String, Object> request=new HashMap<String, Object>();
private Map<String, Object> session=new HashMap<String, Object>();
private Map<String, Object> application=new HashMap<String, Object>();
private User user;
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
public String checkLogin(){
ActionContext actionContext=ActionContext.getContext();
request=(Map<String, Object>) actionContext.get("request");
session=actionContext.getSession();
application=actionContext.getApplication();
request.put("r", "request中的值");
session.put("s", "session中的值");
application.put("a", "application中的值");
return "suc";
}
}
访问真的ServletAPI:
用到ServletActionContext,来获取request;
package com.st.action;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
import com.st.user.User;
public class LoginAction extends ActionSupport {
HttpServletRequest request=null;
HttpSession session=null;
ServletContext application=null;
private User user;
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
public String checkLogin(){
request=ServletActionContext.getRequest();
session=request.getSession();
application=session.getServletContext();
request.setAttribute("r", "request中的值");
session.setAttribute("s", "session中的值");
application.setAttribute("a", "application中的值");
return "suc";
}
}
4 struts2中的拦截器:
继承于AbstractInterceptor,在struts.xml声明拦截器,在Action配置拦截器;
package com.st.in;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;
public class LoginInterceptor extends AbstractInterceptor {
@Override
public String intercept(ActionInvocation invocation) throws Exception {
System.out.println("in Interceptor");
String result=invocation.invoke();
System.out.println("out Interceptor");
return result;
}
}
package com.st.in;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;
public class TwoIntercepto extends AbstractInterceptor {
@Override
public String intercept(ActionInvocation invocation) throws Exception {
System.out.println("in 2 Interceptor");
String res=invocation.invoke();
System.out.println("out 2 Interceptor");
return res;
}
}
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<package name="user" namespace="/user" extends="struts-default">
<interceptors>
<interceptor name="loginIn" class="com.st.in.LoginInterceptor"></interceptor>
<interceptor name="twoIn" class="com.st.in.TwoIntercepto"></interceptor>
<interceptor-stack name="allIn">
<interceptor-ref name="defaultStack"></interceptor-ref>
<interceptor-ref name="loginIn"></interceptor-ref>
<interceptor-ref name="twoIn"></interceptor-ref>
</interceptor-stack>
</interceptors>
<action name="login" class="com.st.action.LoginAction" method="checkLogin">
<interceptor-ref name="allIn"></interceptor-ref>
<result name="suc">/success.jsp</result>
</action>
</package>
</struts>
说明 invocation.invoke();是执行下一个资源,进入下一个拦截器或者Action等;如果没有执行invocation.invoke(),将根据return的字符串在struts.xml匹配result。
拦截用户名 aaa,若出现,跳转到haha.jsp.没有出现最终执行action;
package com.st.in;
import java.util.Map;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;
public class LoginInterceptor extends AbstractInterceptor {
@Override
public String intercept(ActionInvocation invocation) throws Exception {
Map<String, Object> request=(Map<String, Object>) ActionContext.getContext().get("request");
String uname=(String) request.get("user.uname");
System.out.println(uname);
if(uname.equals("aaa")){
return "haha";
}
String result=invocation.invoke();
return result;
}
}
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<package name="user" namespace="/user" extends="struts-default">
<interceptors>
<interceptor name="loginIn" class="com.st.in.LoginInterceptor"></interceptor>
<interceptor name="twoIn" class="com.st.in.TwoIntercepto"></interceptor>
<interceptor-stack name="allIn">
<interceptor-ref name="defaultStack"></interceptor-ref>
<interceptor-ref name="loginIn"></interceptor-ref>
<interceptor-ref name="twoIn"></interceptor-ref>
</interceptor-stack>
</interceptors>
<action name="login" class="com.st.action.LoginAction" method="checkLogin">
<interceptor-ref name="allIn"></interceptor-ref>
<result name="suc">/success.jsp</result>
<result name="haha">/haha.jsp</result>
</action>
</package>
</struts>
5 struts2的路径问题:
当struts2返回页面的路径含有namespace的时候,在该页面跳转到其他jsp页面会产生报错,原因是此时连接含有namespace,此时可以使用跟路径解决此问题。
在返回的jsp页面加上:
<%
String path=request.getContextPath();
String basePath=request.getScheme()+"://"+request.getServerName()+":"
+request.getServerPort()+path+"/";
%>
<base href="<%=basePath %>">
此时页面跳转默认是在basePath基础上的,可以避免命名空间带来的问题;
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%
String path=request.getContextPath();
String basePath=request.getScheme()+"://"+request.getServerName()+":"
+request.getServerPort()+path+"/";
%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<base href="<%=basePath %>">
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
${request.r}<br>
${session.s}<br>
${application.a}<br>
<a href="haha.jsp">haha</a>
</body>
</html>
原文:http://blog.csdn.net/liangwenmail/article/details/47403173