Struts2访问Servlet的三种方式

2025-05-29 0 48

基本介绍

在Struts2中,Action并没有直接和Servlet API耦合。虽然Struts2 中的Action访问Servlet API麻烦一些,但是这却是Struts2中Action的重要改良之一,方便Action进行单元测试。

尽管Action和Servlet API解耦会带来很多好处,然而在Action中完全不访问Servlet API几乎是不可能的,在实现业务逻辑时,经常要访问Servlet中的对象,如request、session和application等 。

在Struts2中,访问Servlet API有3种方法,分别是实现特定接口,通过ServletActionContext类,通过ActionContext类。

思维导图

Struts2访问Servlet的三种方式

实现特定接口访问

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53
package com.pc.web.action;

import javax.servlet.ServletContext;

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.util.ServletContextAware;

import com.opensymphony.xwork2.ActionSupport;

/**

* 使用特定接口访问Servlet对象

* @author Switch

*

* org.apache.struts2.dispatcher.StrutsRequestWrapper@461aa2

* org.apache.catalina.connector.ResponseFacade@7e83df

* org.apache.catalina.core.ApplicationContextFacade@3b102

* org.apache.catalina.session.StandardSessionFacade@5a214b

* 是由一个名称为servletConfig的拦截器为我们封装的

*/

public class ActionTest7 extends ActionSupport implements ServletRequestAware,ServletResponseAware,ServletContextAware {

private HttpServletRequest request;

private HttpServletResponse response;

private ServletContext application;

/**

* @return

*/

public String demo(){

System.out.println(request);

System.out.println(response);

System.out.println(application);

System.out.println(request.getSession());

return SUCCESS;

}

@Override

public void setServletRequest(HttpServletRequest request) {

this.request = request;

}

@Override

public void setServletResponse(HttpServletResponse response) {

this.response = response;

}

@Override

public void setServletContext(ServletContext application) {

this.application = application;

}

}

通过ServletActionContext类

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45
package com.pc.struts2.web.action;

import javax.servlet.ServletContext;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import javax.servlet.http.HttpSession;

import org.apache.struts2.ServletActionContext;

import com.opensymphony.xwork2.ActionSupport;

/**

* 访问ServletAPI的方式

*

* 使用Struts2框架提供了一个工具类:

* ServletActionContext

* 它里面提供了对应的静态方法,可以直接获取ServletAPI

*

* 有一个需要注意的问题:

* org.apache.struts2.dispatcher.StrutsRequestWrapper@4637b3

* org.apache.catalina.connector.ResponseFacade@1f2f2f7

* org.apache.catalina.session.StandardSessionFacade@12d77c1

* org.apache.catalina.core.ApplicationContextFacade@1133ff

*

* requet对象已经不是原来tomcat提供的了,而是被struts2框架包装过了。

* 包装使用的是装饰者模式。

* 装饰者模式的作用是对方法进行增强。

*

* @author Switch

*/

public class ActionAPITest extends ActionSupport {

/**

* 在Struts2框架中使用ServletAPI

* @return

*/

public String useServletAPI() {

HttpServletRequest request = ServletActionContext.getRequest();

HttpServletResponse response = ServletActionContext.getResponse();

HttpSession session = request.getSession();

ServletContext application = ServletActionContext.getServletContext();

System.out.println(request);

System.out.println(response);

System.out.println(session);

System.out.println(application);

return "success";

}

}

通过ActionContext类

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89
package com.pc.web.action;

import java.util.Map;

import javax.servlet.ServletContext;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import javax.servlet.http.HttpSession;

import org.apache.struts2.ServletActionContext;

import org.apache.struts2.StrutsStatics;

import com.opensymphony.xwork2.ActionContext;

import com.opensymphony.xwork2.ActionSupport;

/**

* ActionContext类介绍

* 它是Struts2框架为我们提供的一个工具类。

* 该类可以通过方法直接获取request,response,servletContext对象

* @author Switch

*

* context.getParameters(); == request.getParameterMap(); 获取的是请求参数

*/

public class ActionTest8 extends ActionSupport implements StrutsStatics {

private HttpServletRequest request;

private HttpServletResponse response;

private ServletContext application;

/**

* 使用ActionContext访问ServletAPI

* @return

*/

public String demo(){

ActionContext context = ActionContext.getContext();

request = (HttpServletRequest) context.get(HTTP_REQUEST);

response = (HttpServletResponse) context.get(HTTP_RESPONSE);

application = (ServletContext) context.get(SERVLET_CONTEXT);

System.out.println(request);

System.out.println(response);

System.out.println(application);

System.out.println(request.getSession());

/*org.apache.struts2.dispatcher.StrutsRequestWrapper@112e422

org.apache.catalina.connector.ResponseFacade@13f8b4c

org.apache.catalina.core.ApplicationContextFacade@d244dd

org.apache.catalina.session.StandardSessionFacade@a711cb*/

return SUCCESS;

}

/**

* 使用原始ServletAPI对象,往session域和application域中存入数据

* session域中存入 key=sessionAttr value=hello session attr

* application域中存入 key=applicationAttr value=hello application attr

* @return

*/

public String demo2(){

//1.获取session对象

HttpSession session = ServletActionContext.getRequest().getSession();

//存入数据

session.setAttribute("sessionAttr", "hello session attr");

session.getId();

//2.获取ServletContext

ServletContext application = ServletActionContext.getServletContext();

application.getRealPath("/WEB-INF/uploads");

//存入数据

application.setAttribute("applicationAttr", "hello application attr");

return SUCCESS;

}

/**

* 使用ActionContext类中的getSession()和getApplication()获取到的map来往map中存入数据

* sessionMap中存入 key=sessionAttr value=hello session map

* applicationMap中存入 key=applicationAttr value=hello application map

* @return

*/

public String demo3(){

//1.获取ActionContext对象

ActionContext context = ActionContext.getContext();

//2.获取sessionMap

Map<String,Object> sessionMap = context.getSession();

sessionMap.put("sessionAttr", "hello session map");

//3.获取applicationMap

Map<String,Object> applicationMap = context.getApplication();

applicationMap.put("applicationAttr", "hello application map");

return SUCCESS;

}

}

ActionContext类访问Servlet API的常用方法

方法声明
功能描述
void put(String key,Object value)
将 key-value键值对放入ActionContext 中,模拟Servlet API中的HttpServletRequest的setAttributeO方法。
Object get(String key)
通过参数key来查找当前ActionContext中的值。
Map<String,Object> getApplication()
返回一个Application级的Map对象。
static ActionContext getContext()
获取当前线程的ActionContext对象。
Map<String, Object> getParameters()
返回一个包含所有HttpServletRequest参数信息的Map对象。
Map<String, Object> getSession()
返回一个Map类型的HttpSession对象。
void setApplication(Map<String, Object> application)
设置Application上下文。
void setSession(Map<String, Object> session)
设置一个Map类型的Session值 。

PS:通过对这三种方式的使用,可以发现通过实现特定接口和使用ServletActionContext类,Action是与Servlet API进行直接耦合的,这样并不利于程序解耦。所以开发中建议优先使用ActionContext。

PS:虽然这样,在控制器与Servlet API解耦了,但是在Struts2中肯定有一部分代码还是和Servlet API有耦合,这是毋庸置疑的。如果我们只是需要使用Servlet API中域对象中的域(键值对,存放数据的),那么就使用ServletContext,如果需要使用除了域之外的其他东西,那么还是要使用ServletActionContext的。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持快网idc。

原文链接:http://blog.csdn.net/q547550831/article/details/53324983

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。

快网idc优惠网 建站教程 Struts2访问Servlet的三种方式 https://www.kuaiidc.com/116098.html

相关文章

发表评论
暂无评论