*五)与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
/add.jsp
add.jsp
${applicationScope.sum}
方式2
AddAction
public String execute() throws Exception, IOException{ //获取请求对象request 响应对象response 应用对象ServletContext HttpServletRequest request=ServletActionContext.getRequest(); HttpServletResponse response=ServletActionContext.getResponse(); //方式2 MapapplicationMap=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,不推荐 MapsessionMap=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
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中包含)
/WEB-INF/register_success.jsp
/day31/WebRoot/WEB-INF/register_success.jsp
注册成功
对于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方式传中文参数】