复习 Struts 2(Day0920)[Struts2应用的开发步骤]

1.在web.xml文件中定义核心Filter来拦截用户请求(只有在web.xml文件中配置该框架的核心Servlet或Filter,在能让该框架介入到Web应用中)

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
  <display-name>yq1818_struts2_day0919</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
  <filter>
    <filter-name>struts2</filter-name>
    <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>struts2</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>
</web-app>

2.定义处理用户请求的actio类
【1】、Action中怎么获取Servlet API有三种方式。
   1) 解耦合:ActionContext
   2) 耦合  :ServletActionContext
   3) IOC   :实现接口
              ServletRequestAware:request
              SessionAware:session
              ServletResponseAware:response
-----------------------------------------------------------------------------
3.配置Action

<!-- struts.xml -->
<?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>
	<!-- 默认的视图主题 -->  
    <constant name="struts.ui.theme" value="simple" /> 
    <package name="d1" extends="struts-default">
        <action name="user1" class="com.action.UserAction1" />
    </package>
</struts>

这里使用的是第一种方式(解耦合),即ActionContext.getContext().getSession()


public class UserAction1 extends ActionSupport{
	private Map<String,Object> request;
	private Map<String,Object> session;
	public Map<String, Object> getRequest() {
		return (Map<String,Object>)ActionContext.getContext().get("request");
	}

	public Map<String, Object> getSession() {
		return ActionContext.getContext().getSession();
	}
//请求发送到servlet或filter被拦截(解析,封装参数等等)之后通过struts.xml来找对应的class,通过反射来创建对应的action实例
    //定义处理用户请求的execute方法
	@Override
	public String execute() throws Exception{
		
		this.getRequest().put("request1", "设置到作用域的值");
		this.getSession().put("session1", "session值");
		return super.execute();
	}
----------------------------------------------------------------------------
启动Tomcat,在网址中访问对应的action即可看到如下内容:
http://localhost:8080/Day0920/user1.action

request:设置到作用域的值
session:session值

在MVC框架中控制器实际上由两个部分共同组成,即拦截所有用户请求,处理请求的通用代码都由核心控制器完成,而实际的业务控制(诸如调用Model,返回处理结果等)则由Action处理

上图里灰色区域包括的StrutsPrepareAndExecuteFilterXxxAction共同构成了Struts2的控制器,

StrutsPrepareAndExecuteFilter被称为核心控制器。

XxxAction被称为业务控制器。

第二种方式:Action中以耦合(ServletActionContext)方式获取Servlet API

//耦合  :ServletActionContext
public class UserAction2 extends ActionSupport{
	private HttpServletRequest request;
	private HttpSession session;
	
	public HttpServletRequest getRequest() {
		return ServletActionContext.getRequest();
	}

	public HttpSession getSession() {
		return ServletActionContext.getRequest().getSession();
	}

	@Override
	public String execute() throws Exception {
		this.getRequest().setAttribute("request1", "request21");
		this.getSession().setAttribute("session1", "session21");
		return super.execute();
	}
}

对应struts.xml文件如下

<package name="d1" extends="struts-default">
	<action name="user2" class="com.action.UserAction2" />
</package>
-------------------------------------------------------------
http://localhost:8080/Day0920/user2.action

request:request21
session:session21

第三种方式: IOC   :实现接口
              ServletRequestAware:request
              SessionAware:session
              ServletResponseAware:response

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.struts2.interceptor.ServletRequestAware;
import org.apache.struts2.interceptor.ServletResponseAware;
import org.apache.struts2.interceptor.SessionAware;

import com.opensymphony.xwork2.ActionSupport;
public class UserAction3 extends ActionSupport implements 
ServletRequestAware,SessionAware,ServletResponseAware{
	private HttpServletRequest request;
	private HttpServletResponse response;
	private Map<String,Object> session;
    //可以在执行execute方法前,struts2通过底层拦截器调用set方法帮我们把request,response对象注入到属性里面去
	@Override
	public String execute() throws Exception {
		this.request.setAttribute("request1", "request31");
		this.session.put("session1", "session31");
		return super.execute();
	}
	@Override
	public void setServletResponse(HttpServletResponse response) {
		this.response=response;
	}

	@Override
	public void setSession(Map<String, Object> session) {
		this.session=session;
		
	}

	@Override
	public void setServletRequest(HttpServletRequest request) {
		this.request=request;
		
	}

}
配置<action name="user3" class="com.action.UserAction3" />
访问http://localhost:8080/Day0920/user3.action
得到 request:request31
    session:session31

4.配置处理结果和物理视图资源之间的关系,比如:

<package name="d1" extends="struts-default">
	<action name="user4" class="com.action2.UserAction4">
	<result>/ognl_demo.jsp</result>
	</action>
</package>

  ognl_demo.jsp如下:

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<%@taglib uri="/struts-tags" prefix="s"%>
<%
	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>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
</head>
<body>
	非值栈数据:
	<br />
	<s:set name="age" value="18" scope="request" />
	<s:set name="userName" value="'aaa'" scope="session" />
	<s:set name="test1" value="20" scope="session" />
	<s:set name="test1" value="21" scope="request" />
	age:
	<s:property value="#request.age" />
	-${age}
	<br /> userName:
	<s:property value="#session.userName" />
	<br /> test1(session):
	<s:property value="#session.test1" />
	<br /> test1:
	<s:property value="#attr.test1" />
	<br /> 值栈:
	<br /> loginName:
	<s:property value="loginName" />
	<br /> user.loginName:
	<s:property value="user.loginName" />
	集合遍历:
	<br />
	<s:if test="list!=null && list.size()>0">
		<s:iterator value="list" var="u" status="s1">
			<s:property value="#u.loginName" />-${u.loginName }-index:${s1.index },count:${s1.count}<br />
		</s:iterator>
	</s:if>
	<s:else>没有找到数据</s:else>
</body>
</html>
public class User {
	private String loginName;
	private String password;

	public User() {
	}

	public User(String loginName, String password) {
		this.loginName = loginName;
		this.password = password;
	}

	public String getPassword() {
		return password;
	}

	public void setPassword(String password) {
		this.password = password;
	}

	public String getLoginName() {
		return loginName;
	}

	public void setLoginName(String loginName) {
		this.loginName = loginName;
	}
}
public class UserAction4 extends ActionSupport{
	private String loginName;
	private User user;
	private List<User>list;
	
	@Override
	public String execute() throws Exception {
		loginName="testLogin";
		user=new User("testLogin2","123");
		list=new ArrayList<User>();
		for(int i=0;i<10;i++){
			list.add(new User("test"+i,"123"));
		}
		return super.execute();
	}

	public String getLoginName() {
		return loginName;
	}

	public void setLoginName(String loginName) {
		this.loginName = loginName;
	}

	public User getUser() {
		return user;
	}

	public void setUser(User user) {
		this.user = user;
	}

	public List<User> getList() {
		return list;
	}

	public void setList(List<User> list) {
		this.list = list;
	}
	
}

访问http://localhost:8080/Day0920/user4.action得到如下信息

非值栈数据: 
age: 18 -18 
userName: aaa 
test1(session): 20 
test1: 21 
值栈: 
loginName: testLogin 
user.loginName: testLogin2 集合遍历: 
test0-test0-index:0,count:1
test1-test1-index:1,count:2
test2-test2-index:2,count:3
test3-test3-index:3,count:4
test4-test4-index:4,count:5
test5-test5-index:5,count:6
test6-test6-index:6,count:7
test7-test7-index:7,count:8
test8-test8-index:8,count:9
test9-test9-index:9,count:10

 

Struts1通常是execute方法,Struts2不配置的话默认是execute方法,配置了就是配置的方法

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值