*五)与ServletAPI解耦

方式1

AddAction

public String execute() throws Exception, IOException{
//获取请求对象request 响应对象response 应用对象ServletContext
HttpServletRequest request=ServletActionContext.getRequest();
HttpServletResponse response=ServletActionContext.getResponse();
ServletContext context=ServletActionContext.getServletContext();
//获取表单参数
Integer num1=Integer.parseInt(request.getParameter("num1"));
Integer num2=Integer.parseInt(request.getParameter("num2"));
Integer sum=num1+num2;
//将请求结果放在应用对象中
context.setAttribute("sum", sum);
//将结果放在域对象request中
//request.setAttribute("sum", sum);
//转发到add.jsp中 由struts.xml中的result代替
//request.getRequestDispatcher("/add.jsp").forward(request, response);
return "success";
}

struts_add.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="add" extends="struts-default" namespace="/">
<action name="add" class="cn.itcast.web.struts2.add.AddAction">
<result name="success" type="redirect">
/add.jsp
</result>
</action>
</package>
</struts>

add.jsp

${applicationScope.sum}

方式2

AddAction

public String execute() throws Exception, IOException{
//获取请求对象request 响应对象response 应用对象ServletContext
HttpServletRequest request=ServletActionContext.getRequest();
HttpServletResponse response=ServletActionContext.getResponse();
//方式2
Map<String,Object> applicationMap=ActionContext.getContext().getApplication(); //获取表单参数
Integer num1=Integer.parseInt(request.getParameter("num1"));
Integer num2=Integer.parseInt(request.getParameter("num2"));
Integer sum=num1+num2; applicationMap.put("sum", sum);
//将结果放在域对象request中
//request.setAttribute("sum", sum);
//转发到add.jsp中 由struts.xml中的result代替
//request.getRequestDispatcher("/add.jsp").forward(request, response);
return "success";
}

add.jsp仍然是${applicationScope.sum}

原则:Action不要与传统ServletAPI耦合  目的:解耦

方式3AddAction

public String execute() throws Exception, IOException{
//获取请求对象request 响应对象response 应用对象ServletContext
//HttpServletRequest request=ServletActionContext.getRequest();
HttpServletResponse response=ServletActionContext.getResponse();
//方式3
HttpSession session=request.getSession();//用了Servlet的API,不推荐
Map<String,Object> sessionMap=ActionContext.getContext().getSession();
//获取表单参数
Integer num1=Integer.parseInt(request.getParameter("num1"));
Integer num2=Integer.parseInt(request.getParameter("num2"));
Integer sum=num1+num2;
sessionMap.put("sum", sum);
//将结果放在域对象request中
//request.setAttribute("sum", sum);
//转发到add.jsp中 由struts.xml中的result代替
//request.getRequestDispatcher("/add.jsp").forward(request, response);
return "success";
}

add.jsp  ${sessionScope.sum}

(1)获取HttpServletRequest请求对象/域对象【ServletActionContext.getRequest()】

    的父类【ActionContext.getContext().put("username",username);】

  ActionContext.getContext()返回Map<String,Object>
  获取HttpServletResponse请求对象/域对象【ServletActionContext.getResponse()】
(2)获取ServletContext域对象【ActionContext.getContext().getApplication()】
(3)获取HttpSession域对象【ActionContext.getContext().getSession()】
(4)为什么(2)(3)会返回Map类型呢?
  这是因为Struts2的Action中,不推荐引用ServletAPI,因为只返回Map对象。
  拦截器会将Map中的值,再一次绑定到真实的域对象中,其中key就是Map中的key值。

(5)

day31\WebRoot\register.jsp

 <form action="/day31/register" method="post">
<table border="2" align="center">
<caption><h3>新用户注册(struts2版本)</h3></caption>
<tr>
<th>用户名</th>
<td><input type="text" name="username"/></td>
</tr>
<tr>
<th>密码</th>
<td><input type="text" name="password"/></td>
</tr>
<tr>
<td colspan="2" align="center">
<input type="submit" value="注册"/>
</td>
</tr>
</table>
</form>
cn.itcast.web.struts2.user.UserAction
package cn.itcast.web.struts2.user;

public class UserAction {
//表单参数
private String username;
private String password;
//提供对应的setter方法(拦截器会将表单参数通过setter方法自动注入进来)
public void setUsername(String username) {
this.username = username;
}
public void setPassword(String password) {
this.password = password;
}
//注册的业务控制方法
public String registerMethod(){
System.out.println("用户名:" + username);
System.out.println("密码:" + password);
return "success";
}
}

/day31/src/cn/itcast/web/struts2/user/struts_user.xml(在总的文件/day31/src/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"> <!-- struts2的核心配置文件,在应用部署时加载并解析 -->
<struts>
<include file="cn/itcast/web/struts2/user/struts_user.xml"/>
</struts>
<?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="user" extends="struts-default" namespace="/">
<!-- action name对应form中的action -->
<action
name="register"
class="cn.itcast.web.struts2.user.UserAction"
method="registerMethod">
<result name="success" type="dispatcher">
/WEB-INF/register_success.jsp
</result>
</action>
</package>
</struts>

/day31/WebRoot/WEB-INF/register_success.jsp

  <body>
注册成功<br/>
</body>

对于POST请求,框架默认采用UTF-8编码方式,无需设置/day31/src/struts.properties
struts.i18n.encoding=UTF-8  类似于:request.setCharacterEncoding("UTF-8")

以上配置,只针对POST请求。
struts2框架提倡按如下原则发送请求:
A)无参使用GET,框架没提交解决方案
B)有参使用POST
(6)项目中使用POST和GET请求方式的原则
【struts2以POST或GET方式传中文参数】

(4)获取servlet常用api的更多相关文章

  1. Servlet 常用API学习(三)

    Servlet常用API学习 (三) 一.HTTPServletRequest简介 Servlet API 中定义的 ServletRequest 接口类用于封装请求消息. HttpServletRe ...

  2. Servlet 常用API学习(二)

    Servlet常用API学习 一.HTTP简介 WEB浏览器与WEB服务器之间的一问一答的交互过程必须遵循一定的规则,这个规则就是HTTP协议. HTTP是 hypertext transfer pr ...

  3. Servlet 常用API学习(一)

    Servlet常用API学习 一.Servlet体系结构(图片来自百度图片) 二.ServletConfig接口 Servlet在有些情况下可能需要访问Servlet容器或借助Servlet容器访问外 ...

  4. Struts2获取Servlet的api的两种方式,解决ParameterAware过时的问题

    servlet API通过ActionContext进行获取 Struts2对HttpServletRequest,HttpSession和ServletContext进行了封装,构造了3个Map对象 ...

  5. 获取Servlet原生API

    1.请求 <a href="param/test1">Servlet原生API</a> 2.处理方法 @RequestMapping("/para ...

  6. struts2中在Action中如何获取servlet的api?

    1.通过ActionContext类(拿到的不是真正的servlet api,而是一个map) ActionContext context = ActionContext.getContext(); ...

  7. Struts2框架中使用Servlet的API示例

    1. 在Action类中也可以获取到Servlet一些常用的API * 需求:提供JSP的表单页面的数据,在Action中使用Servlet的API接收到,然后保存到三个域对象中,最后再显示到JSP的 ...

  8. 在Struts2框架中使用Servlet的API

    1. 在Action类中也可以获取到Servlet一些常用的API * 需求:提供JSP的表单页面的数据,在Action中使用Servlet的API接收到,然后保存到三个域对象中,最后再显示到JSP的 ...

  9. Struts2中获取servlet API的几种方式

    struts2是一个全新的MVC框架,如今被广大的企业和开发者所使用,它的功能非常强大.这给我们在使用servlet 纯java代码写项目的时候带来了福音.但是一般来说,我们的项目不到一定规模并不需要 ...

随机推荐

  1. imagemagick imagick

    imagemagick#图像处理软件 安装解压 ./configure make make install imagick#是php图像扩展模块 调用imagemagick处理图像 安装解压/opt/ ...

  2. SqlServer 垂直分表

    当单表数据太多时.我们能够水平划分,參考 SqlServer 分区视图实现水平分表 ,水平划分能够提高表的一些性能. 而 垂直分表 则相对非常少见到和用到,由于这可能是数据库设计上的问题了.假设数据库 ...

  3. vue DOM模板解析

    当使用 DOM 作为模板时 (例如,使用 el 选项来把 Vue 实例挂载到一个已有内容的元素上),你会受到 HTML 本身的一些限制,因为 Vue 只有在浏览器解析.规范化模板之后才能获取其内容.尤 ...

  4. js 中文校验并过滤掉中文

      js中文校验并过滤掉中文 CreateTime--2017年9月6日09:10:19 Author:Marydon 思路: 1.判断字符串中是否包含中文: 2.存在中文时,过滤掉. 举例: var ...

  5. 【Python】分析文本split()

    分析单个文本 split()方法,是以空格为分隔符将字符串拆分成多个部分,并将这些部分存储到一个列表中 title = 'My name is oliver!' list = title.split( ...

  6. json和jsonp以及ajax

    简单的说: JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式. JSON的优点: 1.基于纯文本,跨平台传递极其简单: 2.Javascript原生支持,后 ...

  7. python 中给文件加锁——fcntl模块

    如果没有fcntl模块则用 sudo pip install fcntl安装 模块简单说明: 打开文件,不存在则创建之 f = open('./test','w') fcntl.flock(f,fcn ...

  8. springboot+async异步接口实现和调用

    什么是异步调用? 异步调用是相对于同步调用而言的,同步调用是指程序按预定顺序一步步执行,每一步必须等到上一步执行完后才能执行,异步调用则无需等待上一步程序执行完即可执行. 如何实现异步调用? 多线程, ...

  9. client交互技术简单介绍

    随着网络应用的不断丰富,client交互技术也如雨后春笋一般,遍地开花. 正是这些技术的支持,我们的互联网世界变得更加丰富多彩.一个浏览器上.不用说是简单的动画效果,就是一个Office应用也能顺畅的 ...

  10. Nonblocking Memory Refresh&2018ISCA/Security& 非阻塞内存刷新

    Abstract 我们提议的非阻塞刷新工作是一次刷新内存块中的一部分数据,并在内存块中使用冗余数据,如RS码,在块中计算块的刷新/不可读数据以满足读取请求.作为概念的证明,我们将非阻塞刷新应用于服务器 ...