struts2笔记之第六讲
Struts2的Action访问Servlet API
1、可以通过ActionContext访问Servlet API 此种方式没有侵入性
使用方法如下:
*将登陆信息设置到session中
ActionContext.getContext().getSession().put("user", username);
*采用如下方式访问request对象
ActionContext.getContext().put("time", new Date());
*采用如下方式访问application对象
ActionContext.getContext().getApplication().put("我的应用程序", "我的应用程序");
*取得表单数据也可以用以下方式:request.getParameter();
String username = (String) ActionContext.getContext().getParameters().get("username");
2.在Struts2中默认为转发,也就是<result>标签中的type="dispatcher",type的属性可以修改为重定向
<result name="login" type="dispatcher">/login.jsp</result>
(type的默认值为dispatcher,就是type="dispatcher" 表示转发)
Struts2的重定向有两种:
*、type="redirect",可以重定向到任何一个web资源,如jsp或Action,如果要重定向到Action,需要写上后缀,xxxx.action
<result name="login" type="redirect">/login.jsp</result>
<result name="login" type="redirect">login.action</result>
*、type="redirectAction" 可以重定向到Action,不需要写后缀,此种方式更通用些,不会因为后缀的改变影响配置
<result name="login" type="redirectAction">login</result>
3、关于Struts2的type类型,也就是Result类型,他们都实现了共同的接口Result,都实现了execute方法,
他们体现了策略模式(策略模式:可以配置的),
具体Result类型参见:struts-default.xml文件
<result-types>
<result-type name="chain" class="com.opensymphony.xwork2.ActionChainResult"/>
<result-type name="dispatcher" class="org.apache.struts2.dispatcher.ServletDispatcherResult" default="true"/>
<result-type name="freemarker" class="org.apache.struts2.views.freemarker.FreemarkerResult"/>
<result-type name="httpheader" class="org.apache.struts2.dispatcher.HttpHeaderResult"/>
<result-type name="redirect" class="org.apache.struts2.dispatcher.ServletRedirectResult"/>
<result-type name="redirectAction" class="org.apache.struts2.dispatcher.ServletActionRedirectResult"/>
<result-type name="stream" class="org.apache.struts2.dispatcher.StreamResult"/>
<result-type name="velocity" class="org.apache.struts2.dispatcher.VelocityResult"/>
<result-type name="xslt" class="org.apache.struts2.views.xslt.XSLTResult"/>
<result-type name="plainText" class="org.apache.struts2.dispatcher.PlainTextResult" />
</result-types>
上面体现的策略模式,所以我们完全可以自己根据需求扩展Result类型
4、全局Result和局部Result
*局部的Result
<result name="login" type="redirect">/login.jsp</result>
* 全局Result
<global-results>
<result name="login" type="redirect">/login.jsp</result>
</global-results>
例子:
LoginAction.java文件
package com.struts2;
import java.util.Date;
import com.opensymphony.xwork2.Action;
import com.opensymphony.xwork2.ActionContext;
public class LoginAction implements Action {
private String username;
private String password;
/**
* struts2 默认调用这个方法,返回字符串
* @return
* @throws Exception
*/
public String execute() throws Exception{
if("admin".equals(username) && "admin".equals(password)){
//将登陆信息设置到session中
ActionContext.getContext().getSession().put("user", username);
//采用如下方式访问request对象
ActionContext.getContext().put("time", new Date());
//采用如下方式访问application对象
ActionContext.getContext().getApplication().put("我的应用程序", "我的应用程序");
//取得表单数据也可以用以下方式
String username = (String) ActionContext.getContext().getParameters().get("username");
return "success";
}else{
return "error";
}
}
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;
}
}
MustLoginAction.java文件
package com.struts2;
import com.opensymphony.xwork2.Action;
import com.opensymphony.xwork2.ActionContext;
public class MustLoginAction implements Action {
@Override
public String execute() throws Exception {
if(ActionContext.getContext().getSession().get("user")==null){
//重定向到登陆页面
return LOGIN;
}else{
return SUCCESS;
}
}
}
struts.xml文件
<?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>
<!--当struts.xml配置文件发生修改,会立刻加载,在生产环境下最好不要配置-->
<constant name="struts.configuration.xml.reload" value="true"/>
<!--会提供更加友好的提示信息-->
<constant name="struts.devMode" value="true"/>
<!-- 需要继承struts-defaluts包,这样就拥有基本的功能 -->
<package name="struts2" extends="struts-default">
<!-- 全局Result -->
<global-results>
<result name="login" type="redirect">/login.jsp</result>
</global-results>
<action name="login" class="com.struts2.LoginAction">
<result>/login_success.jsp</result>
<result name="error">/login_error.jsp</result>
</action>
<action name="mustLogin" class="com.struts2.MustLoginAction" >
<!-- type的默认值为dispatcher,就是type="dispatcher" 表示转发 -->
<!-- <result name="login" type="dispatcher">/login.jsp</result> -->
<!-- type="redirect",可以重定向到任何一个web资源,如jsp或Action,如果要重定向到Action,需要写上后缀,xxxx.action -->
<!-- <result name="login" type="redirect">/login.jsp</result> -->
<!-- <result name="login" type="redirect">login.action</result> -->
<!-- type="redirectAction" 可以重定向到Action,不需要写后缀,此种方式更通用些,不会因为后缀的改变影响配置 -->
<!-- <result name="login" type="redirectAction">login</result> -->
<!-- 局部的Result -->
<!-- <result name="login" type="redirect">/login.jsp</result> -->
<result >/must_login.jsp</result>
</action>
</package>
</struts>
index.jsp文件,核心内容
<a href="login.jsp">登陆</a> <br>
<a href="mustLogin.action">访问受保护的页面</a> <br>
must_login.jsp文件加一句话:
该页面是受保护的