Struts2学习笔记(四)-----Struts2访问Servlet的API三种方式

目录

 

方式一:完全解耦合的方式

备注 :完全解耦合的方式只能获得代表request、session、application的数据的Map集合,不能操作这些对象的本身的方法。

方式二:原生的方式

备注 :原生的方式可以操作域对象的数据,同时也可以获得对象的方法。

方式三:接口注入的方式

 备注 :Servlet是单例的,多个程序访问同一个Servlet只会创建一个Servlet的实例。Action是多例的,一次请求,创建一个Action的实例(不会出现线程安全的问题)。


方式一:完全解耦合的方式

1 、编写 jsp 页面

demo1.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>Struts2访问Servlet的API方式</h1>
<h3>访问方式一:完全解耦合的方式</h3>
<form action="${pageContext.request.contextPath }/requestDemo1.action" method="post">
   姓名:<input type="text" name="name"><br>
   密码:<input type="password" name="password"><br>
  <input type="submit" value="登录">   
</form>
</body>
</html>

 demo2.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>显示域对象数据</h1>

${requestName }
${sessionName }
${applicationName }

</body>
</html>

2 、编写 Action 类

package czm.struts2.demo1;

import java.util.Arrays;
import java.util.Map;

import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;

/**
 * Struts2访问Servlet的API方式一:完全解耦合的方式
 * @author ASUS
 *
 */
public class RequestDemo1 extends ActionSupport{
   @Override
public String execute() throws Exception {
	//一 、接收参数
	//利用Struts2中ActionContext对象
	ActionContext context = ActionContext.getContext();
	//调用ActionContext中的方法
	Map<String,Object> map = context.getParameters();  //key值为Object类型
	for (String key : map.keySet()) {
		String[] values = (String[])map.get(key);   //将key值Object类型转换为String数组
		System.out.println(key+"  "+Arrays.toString(values));
	}
	
	//二 、向域对象中存入数据
	context.put("requestName", "request数据");  //相当于request.setAttribute();
	context.getSession().put("sessionName", "session数据");  //相当于session.setAttribute();
	context.getApplication().put("applicationName", "application数据");  //相当于application.setAttribute();
	
	return SUCCESS;
 }
}

 3 、编写 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>
   <package name="demo1" extends="struts-default" namespace="/">
       <action name="requestDemo1" class="czm.struts2.demo1.RequestDemo1">
           <result name="success">/demo1/demo2.jsp</result>
       </action>
   
   </package>

	
</struts>

4 、访问 JSP 页面

5 、输入数据,点击登录 

获取到输入信息:

获取到域中对象 :

 

备注完全解耦合的方式只能获得代表request、sessionapplication的数据的Map集合,不能操作这些对象的本身的方法。

方式二:原生的方式

1 、编写 JSP 页面

demo1.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>Struts2访问Servlet的API方式</h1>
<h3>访问方式一:完全解耦合的方式</h3>
<form action="${pageContext.request.contextPath }/requestDemo1.action" method="post">
   姓名:<input type="text" name="name"><br>
   密码:<input type="password" name="password"><br>
  <input type="submit" value="登录">   
</form>


<h3>访问方式二:使用原生的方式</h3>
<form action="${pageContext.request.contextPath }/requestDemo2.action" method="post">
   姓名:<input type="text" name="name"><br>
   密码:<input type="password" name="password"><br>
  <input type="submit" value="登录">   
</form>
</body>
</html>

demo2.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>显示域对象数据</h1>
${requestName }
${sessionName }
${applicationName }

</body>
</html>

2 、编写 Action 类

package czm.struts2.demo1;

import java.util.Arrays;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;

import org.apache.struts2.ServletActionContext;

import com.opensymphony.xwork2.ActionSupport;
/**
 * Struts2访问Servlet的API方式二 :原生的方式
 * @author ASUS
 *
 */
public class RequestDemo2 extends ActionSupport {
    @Override
    public String execute() throws Exception {
    	// 一 、接收数据
    	//通过 ServletActionContext 直接获得 request对象
    	HttpServletRequest request = ServletActionContext.getRequest();
    	Map<String, String[]> map = request.getParameterMap();
    	for (String key : map.keySet()) {
			String[] values = map.get(key);
			System.out.println(key+"   "+Arrays.toString(values));
		}
    	
    	// 二 、向域对象中存入数据
    	//向 request中保存数据
    	request.setAttribute("requestName", "原生方式获取request数据");
    	//向session中保存数据
    	request.getSession().setAttribute("sessionName", "原生方式获取session数据");
    	//向application中保存数据
    	ServletActionContext.getServletContext().setAttribute("applicationName", "原生方式获取application数据");
    	
    	return SUCCESS;
    }
}

3 、编写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>
   <package name="demo1" extends="struts-default" namespace="/">
       <!-- 完全解耦方式配置 -->
       <action name="requestDemo1" class="czm.struts2.demo1.RequestDemo1">
           <result name="success">/demo1/demo2.jsp</result>
       </action>
   
       
       <!-- 原生方式配置 -->
       <action name="requestDemo2" class="czm.struts2.demo1.RequestDemo2">
           <result name="success">/demo1/demo2.jsp</result>
       </action>
   </package>

	
</struts>

4 、访问 JSP 页面

 

 

 5 、输入数据,点击登录 

获取到输入信息:

 获取到域中对象 :

备注 :原生的方式可以操作域对象的数据,同时也可以获得对象的方法。

方式三:接口注入的方式

1 、编写 JSP 页面

demo1.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>Struts2访问Servlet的API方式</h1>
<h3>访问方式一:完全解耦合的方式</h3>
<form action="${pageContext.request.contextPath }/requestDemo1.action" method="post">
   姓名:<input type="text" name="name"><br>
   密码:<input type="password" name="password"><br>
  <input type="submit" value="登录">   
</form>


<h3>访问方式二:使用原生的方式</h3>
<form action="${pageContext.request.contextPath }/requestDemo2.action" method="post">
   姓名:<input type="text" name="name"><br>
   密码:<input type="password" name="password"><br>
  <input type="submit" value="登录">   
</form>


<h3>访问方式三:接口注入的方式</h3>
<form action="${pageContext.request.contextPath }/requestDemo3.action" method="post">
   姓名:<input type="text" name="name"><br>
   密码:<input type="password" name="password"><br>
  <input type="submit" value="登录">   
</form>
</body>
</html>

 demo2.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>显示域对象数据</h1>
${requestName }
${sessionName }
${applicationName }

</body>
</html>

2 、编写 Action 类

package czm.struts2.demo1;

import java.util.Arrays;
import java.util.Map;

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

import org.apache.struts2.interceptor.ServletRequestAware;
import org.apache.struts2.util.ServletContextAware;

import com.opensymphony.xwork2.ActionSupport;

/**
 * Struts2访问Servlet的API方式三 :接口注入的方式
 * @author ASUS
 *
 */
public class RequestDemo3 extends ActionSupport implements ServletRequestAware,ServletContextAware{
    private HttpServletRequest request;
	private ServletContext context;
	

	@Override
    public String execute() throws Exception {
    	// 一 、接收参数
		//通过接口注入的方式获得 request对象
		Map<String, String[]> map = request.getParameterMap();
		for (String key : map.keySet()) {
			String[] values = map.get(key);
			System.out.println(key+"   "+Arrays.toString(values));
		}
		
		// 二 、向域对象中存入数据
    	//向 request中保存数据
    	request.setAttribute("requestName", "接口注入方式获取request数据");
    	//向session中保存数据
    	request.getSession().setAttribute("sessionName", "接口注入方式获取session数据");
    	//向application中保存数据
    	context.setAttribute("applicationName", "接口注入方式获取application数据");
    	
    	return super.execute();
    }

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

	@Override
	public void setServletContext(ServletContext context) {
		this.context = context;
		
	}
}

3 、编写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>
   <package name="demo1" extends="struts-default" namespace="/">
       <!-- 完全解耦方式配置 -->
       <action name="requestDemo1" class="czm.struts2.demo1.RequestDemo1">
           <result name="success">/demo1/demo2.jsp</result>
       </action>
   
       
       <!-- 原生方式配置 -->
       <action name="requestDemo2" class="czm.struts2.demo1.RequestDemo2">
           <result name="success">/demo1/demo2.jsp</result>
       </action>
       

       <!-- 接口注入方式配置 -->
       <action name="requestDemo3" class="czm.struts2.demo1.RequestDemo3">
           <result name="success">/demo1/demo2.jsp</result>
       </action>
       
   </package>

	
</struts>

4 、访问 JSP 页面

 

  5 、输入数据,点击登录 

获取到输入信息:

 获取到域中对象 :

 备注 :Servlet是单例的,多个程序访问同一个Servlet只会创建一个Servlet的实例。Action是多例的,一次请求,创建一个Action的实例(不会出现线程安全的问题)。

猜你喜欢

转载自blog.csdn.net/Rachel_pan/article/details/87740346