struts2笔记之第六讲

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文件加一句话:
该页面是受保护的     

你可能感兴趣的:(ActionContext,转发和重定向)