*五)与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. jquery插件jTemplates使用方法

    简单记一下我所做项目中用到的代码,以备以后用的时候一看明确了. 1.jsp(jquery-jtemplates.js下载地址:http://download.csdn.net/detail/xlb74 ...

  2. HBase笔记

    吴超 1.1 Hbase是Hadoop中的数据库,Hadoop还需要数据库吗?我们学的Hadoop是一个分布式的存储和计算的平台 为什么要在他上面建一个数据库呢,数据库是干什么的呢,数据库是一个管理系 ...

  3. java个人感想

    java与c++相比,摒弃了c++的指针,把c++中的stl封装成一个库,而且改变了当中的某些方法,使用方法也产生了非常多不同,读者在编程过程中须要自己细细体会 个人觉得三大框架基于前端+领域逻辑+数 ...

  4. Solr局部或指定字段更新之set用法

    solr wiki文档也有        http://yonik.com/solr/atomic-updates/         java code   public static void up ...

  5. linux下robotframework执行测试用例的几种方法

    1.执行指定的测试用例文件(Test Suite)     [root@localhost cases]# pybot purge.txt   2.执行整个porject目录下的所有测试用例     ...

  6. git stash 保存当前工作状态

    1. git stash   暂存当前工作状态 2. git stash list 查看暂存列表 3. git stash save 'title' 暂存工作状态并添加说明 4. git stash ...

  7. Mongodb之备份恢复脚本

    本分脚本: !/bin/bash #备份文件执行路径 which mongodump DUMP= #临时备份目录 OUT_DIR= #本分存放目录 TAR_DIR= #获取当前系统时间==> 2 ...

  8. Linux kernel manpages

    https://www.linuxquestions.org/questions/linux-newbie-8/man-pages-for-kernel-functions-758389/ 在Linu ...

  9. iOS开发人员程序许可协议

    请细致阅读以下的许可协议条款和条件之前下载或使用苹果软件.   这些条款和条件构成你和苹果之间的法律协议.   iOS开发人员程序许可协议   目的 你想使用苹果软件(例如以下定义)来开发一个或多个应 ...

  10. 【Java】 Spring依赖注入小试牛刀:编写第一个Spring ApplicationContext Demo

    0  Spring的依赖注入大致是这样工作的: 将对象如何构造(ID是什么?是什么类型?给属性设置什么值?给构造函数传入什么值?)写入外部XML文件里.在调用者需要调用某个类时,不自行构造该类的对象, ...