(4)获取servlet常用api
*五)与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方式传中文参数】