首先我们了解一下Action:其功能与Servlet相同,主要负责请求的处理和响应及Request和Response,只不过其继承的父类不同罢啦。
原理:当Struts2接收到请求以后,就会创建相应的Action的实例来处理请求,Action会从数据库读取请求的相应记录,并把这些信息保存到自己的属性中,而Struts2又会把这个Action保存到值栈中,以供OGNL访问。
例:
UpdateHouse代码:
package com.cn.action;
import java.text.SimpleDateFormat;
import java.util.Date;
import org.apache.struts2.ServletActionContext;
import com.cn.entity.House;
import com.cn.service.UserService;
public class UpdateHouse extends BaseAction {
/**
* 更新信息
*/
private static final long serialVersionUID = -3353758218527815967L;
private UserService userService;
private House updateHouse;
private House house;
private String mag;
public String execute() throws Exception {
int id = Integer.parseInt(this.request.getParameter("id"));
updateHouse = this.userService.findHouse(id);
//ServletActionContext.getRequest().setAttribute("housePage", house);
this.request.setAttribute("housePage", updateHouse);
return SUCCESS;
}
public String updateHouseInf(){
try{
int id = Integer.parseInt(this.request.getParameter("id"));
house.setId(id);
house.setPublishtime(new SimpleDateFormat("yyyy-MM-dd hh:mm:ss").format(new Date()));
int i = this.userService.updateHouse(house);
if(i==1){
mag = "修改成功";
}else{
mag = "修改失败";
}
}catch(Exception e){
mag = "修改失败";
}
this.request.setAttribute("message", mag);
return SUCCESS;
}
public void setUserService(UserService userService) {
this.userService = userService;
}
public UserService getUserService() {
return userService;
}
public House getUpdateHouse() {
return updateHouse;
}
public void setUpdateHouse(House updateHouse) {
this.updateHouse = updateHouse;
}
public House getHouse() {
return house;
}
public void setHouse(House house) {
this.house = house;
}
public String getMag() {
return mag;
}
public void setMag(String mag) {
this.mag = mag;
}
}
当UpdateHouse接收请求并调用execute()方法处理请求后,属性updateHouse中保存了从从数据库读取的信息,那么该属性就会被存入值栈中。可以通过<s:dubug>标签来验证是否已经存入值栈啦。
housePage.jsp代码
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib uri="/struts-tags" prefix="s" %>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head><title>查看值栈</title></head>
<body>
<s:debug></s:debug>
</body>
</html>
<action>的配置
<package name="house" namespace="/house" extends="struts-default">
<action name="gotoHouse" class="com.cn.action.UpdateHouse">
<result>/housePage.jsp</result>
</action>
</package>
可以发现,UpdateHouse对象被存入了值栈,该对象的updateHouse属性在值栈中也能找到。。
如果需要把值栈中的内容显示在JSP页面上,就需要使用OGNL表达式了。如:
<s:property value="updateHouse.id" />即可在页面上显示数据啦。(Action一定要有getter和setter方法,不然就获取不啦值)
下面我们再来说说访问Action以外的数据,如request,session,application等,它们存放在Stack Context中。
上面this.request.setAttribute("message", mag);的mag信息就存放在StackContext中
我们可以JSP页面用<s:property value="#request.mag" />获取值
如果能过成功跳转页面却不显示结果,那可能就是你的Action中的问题啦。
在<result>标签中不要添加type的属性即可(我就是加了一个 type="redirect"属性,改了好多地方都不显示数据,结果取啦type 就一切OK啦)