Struts2学习笔记(三)

访问Web元素

取得Map类型request,session,application,真实类型 HttpServletRequest, HttpSession, ServletContext的引用: 

1. 前三者:依赖于容器 

2. 前三者:IOC (只用这种) 

3. 后三者:依赖于容器 

4. 后三者:IOC

 方法一:ActionContext方式

一般在Action类的构造方法、或execute()方法中获取。

public class LoginAction1 extends ActionSupport {
	
	private Map request;
	private Map session;
	private Map application;
	
	public LoginAction1() {
		request = (Map)ActionContext.getContext().get("request");
		session = ActionContext.getContext().getSession();
		application = ActionContext.getContext().getApplication();
	}
	
	public String execute() {
		request.put("r1", "r1");
		session.put("s1", "s1");
		application.put("a1", "a1");
		return SUCCESS; 
	}
}

在构造方法中已经得到了requestsessionapplication对象了,然后在execute方法中对它们添加相应的值。对应的jsp页面代码如下:

<body>
		<form name="f" action="" method="post">
			  姓名:
			<input type="text" name="name" />
			密码:
			<input type="text" name="password" />
			<br />
			<input type="button" value="submit1"
				οnclick="javascript:document.f.action='login1';document.f.submit();">
			<input type="button" value="submit2"
				οnclick="javascript:document.f.action='login2';document.f.submit();">
			<input type="button" value="submit3"
				οnclick="javascript:document.f.action='login3';document.f.submit();">
			<input type="button" value="submit4"
				οnclick="javascript:document.f.action='login4';document.f.submit();">
		</form>
	</body>

这里用到了javascript相关内容,首先定义form表单,action对应为空,当点击不同的提交按钮时,onclick对应不同的action然后在Jsp页面中获取相关web元素

<body>
	User Login Success!
	<br />
	<s:property value="#request.r1"/> | <%=request.getAttribute("r1") %> <br />
	<s:property value="#session.s1"/> | <%=session.getAttribute("s1") %> <br />
	<s:property value="#application.a1"/> | <%=application.getAttribute("a1") %> <br />
	<s:property value="#attr.a1"/><br />
	<s:property value="#attr.s1"/><br />
	<s:property value="#attr.r1"/><br />
	<s:debug></s:debug>
	<br />
</body>

注:因为requestsessionapplication对象Struts2将放入到Action Context中,因此需要使用#key来访问对象们。后面的是java脚本代码的访问方式。

 

方式二:Ioc(控制反转)—推荐使用

Action类实现RequestAwareSessionAwareApplicationAware接口,然后重写他们的set方法(setRequestsetSessionsetApplication),通过依赖注入、控制反转(原来自己控制,现在由别人来控制值。)

import org.apache.struts2.interceptor.ApplicationAware;
import org.apache.struts2.interceptor.RequestAware;
import org.apache.struts2.interceptor.SessionAware;
import com.opensymphony.xwork2.ActionSupport;
public class LoginAction2 extends ActionSupport implements RequestAware,SessionAware, ApplicationAware {
	private Map<String, Object> request;
	private Map<String, Object> session;
	private Map<String, Object> application;
	
	//DI dependency injection依赖注入
	//IoC inverse of control控制反转
	public String execute() {
		request.put("r1", "r1");
		session.put("s1", "s1");
		application.put("a1", "a1");
		return SUCCESS; 
	}
	@Override
	public void setRequest(Map<String, Object> request) {
		this.request = request;
	}
	@Override
	public void setSession(Map<String, Object> session) {
		this.session = session;
	}
	@Override
	public void setApplication(Map<String, Object> application) {
		this.application = application;
	}
}

在视图(JSP)页面中获取相关对象,同方式一。

 

方式三:获取原类型

获取是的HttpServletRequest/HttpSession/ServletContext

public class LoginAction3 extends ActionSupport {
	
	private HttpServletRequest request;
	private HttpSession session;
	private ServletContext application;
	public LoginAction3() {
		request = ServletActionContext.getRequest();
		session = request.getSession();
		application = session.getServletContext();
	}
	public String execute() {
		request.setAttribute("r1", "r1");
		session.setAttribute("s1", "s1");
		application.setAttribute("a1", "a1");
		return SUCCESS; 
	}
}

 

方式四:获取原类型-控制反转

首先需要Action实现org.apache.struts2.interceptor.ServletRequestAware接口,然后重写setServletRequest()方法,获取HttpServletRequest对象,再通过HttpServletRequest对象取昨HttpSessionServletContext对象。

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

import org.apache.struts2.interceptor.ServletRequestAware;
import com.opensymphony.xwork2.ActionSupport;
public class LoginAction4 extends ActionSupport implements ServletRequestAware {
	private HttpServletRequest request;
	private HttpSession session;
	private ServletContext application;
	public String execute() {
		request.setAttribute("r1", "r1");
		session.setAttribute("s1", "s1");
		application.setAttribute("a1", "a1");
		return SUCCESS; 
	}
	@Override
	public void setServletRequest(HttpServletRequest request) {
		this.request = request;
		this.session = request.getSession();
		this.application = session.getServletContext();
	}
}

 

Struts2配置文件模块化包含(include)

<include>标签

Struts配置文件比较多,需要模块化划分或分开成为多个配置文件时,这个功能比较好。

则需要使用<include>标签把其它的配置文件引入到Struts.xml配置文件中就可以了。

例如:有一个login.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>
    <package name="login" extends="struts-default" namespace="/login">
        <action name="login*" class="com.bjsxt.struts2.user.action.LoginAction{1}">
            <result>/user_login_success.jsp</result>
        </action>
    </package>
</struts>

则需要在struts.xml文件中使用<include>标签将其引入就可以了。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>
    <constant name="struts.devMode" value="true" />
    <include file="login.xml" />
</struts>

 

默认的Action

当用户访问的namespace下一个不存在的Action,则会将使用默认的Action

使用<default-action-ref name=name>标签 其中 name属性指向下面已经定义的Action名称了。

<struts>
    <constant name="struts.devMode" value="true" />
    
    <package name="default" namespace="/" extends="struts-default">
    	<default-action-ref name="index"></default-action-ref>
    	<action name="index">
    		<result>/default.jsp</result>
    	</action>
    </package>
</struts>

当前访问namespace=”/”下不存在的Action时,则返回自动转到访问/default.jsp页面。











 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值