標籤:j2ee ssh架構 spring4 hibernate4 struts2
整合SSH架構(2)
Spring4+hibernate4+Struts2的整合,整合完成後我會把這個項目上傳上去,但是我的建議是最好還是自己在自己的電腦上自己整合一下,我不保證一定沒問題
1、整合Struts2之前
前面我們已經整合了spring4和hibernate4,接下來我們繼續整合Struts2
引入一些Struts2的包
其中有部分是重複的,比如commons-logging這個包,這個大家自己看著刪
2、開始整合,我們先配置web.xml
<?xml version="1.0" encoding="UTF-8"?><web-app xmlns="http://java.sun.com/xml/ns/javaee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://java.sun.com/xml/ns/javaeehttp://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0"><!-- 在web容器中執行個體化spring容器 --><context-param><param-name>contextConfigLocation</param-name><param-value>classpath:applicationContext.xml</param-value><!-- 這個指定spring的設定檔,預設從web根目錄尋找設定檔,我們可以通過spring提供的classpath:首碼指定從類路徑下 尋找 --></context-param><!-- 執行個體化spring容器 --><listener><listener-class>org.springframework.web.context.ContextLoaderListener</listener-class></listener><filter> <filter-name>struts2</filter-name> <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class><!-- <init-param> <param-name>config</param-name> <param-value>struts.xml</param-value> </init-param> --> </filter> <filter-mapping> <filter-name>struts2</filter-name> <url-pattern>/*</url-pattern> </filter-mapping><welcome-file-list><welcome-file>index.jsp</welcome-file></welcome-file-list></web-app>
這個Struts2的部分和單個的Struts2的配置一樣,不一樣的地方就是加入了用web.xml管理spring的執行個體化
這裡我們先看看用這個org.springframework.web.context.ContextLoaderListener監控spring執行個體化的檔案吧執行個體化檔案放到那裡去了???
我們開啟這個類的源碼,找到這個方法,進入到initWebApplicationContext裡面去看看,
在原始碼裡面我們可以找到
servletContext.setAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE, this.context);
這下我們知道了,他是放到了servletContext裡面去了,後面我們就在這個裡面取出來
3、接下來我們繼續配置Struts2.xml檔案
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE struts PUBLIC"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN""http://struts.apache.org/dtds/struts-2.3.dtd"><struts><package name="person" extends="struts-default"><action name="PersonAction" class="cn.cutter_point.web.action.PersonAction" method="execute"><result name="list">page/personlist.jsp</result></action></package></struts>
我們就以前面建立的person類為代表,取得所有的persons對象
我們寫一下我們的action類,來處理跳轉,以及調用業務
PersonAction.java
/** * 功能:整合ssh架構 * author:cutter_point * 時間:2015年3月29日17:30:07 */package cn.cutter_point.web.action;import javax.servlet.ServletContext;import javax.servlet.http.HttpServletRequest;import org.apache.struts2.ServletActionContext;import org.springframework.web.context.WebApplicationContext;import org.springframework.web.context.support.WebApplicationContextUtils;import cn.cutter_point.service.PersonService;import com.opensymphony.xwork2.ActionSupport;public class PersonAction extends ActionSupport {@Overridepublic String execute() throws Exception {//擷取執行個體,方法1ServletContext sc = ServletActionContext.getRequest().getSession().getServletContext();WebApplicationContext wac = (WebApplicationContext) sc.getAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE);//方法2WebApplicationContext webApplicationContext = WebApplicationContextUtils.getRequiredWebApplicationContext(ServletActionContext.getServletContext());if(wac == webApplicationContext){System.out.println("ok!!!");}PersonService personService = (PersonService) wac.getBean("personServiceBean");HttpServletRequest request = ServletActionContext.getRequest();request.setAttribute("persons", personService.getPersons());return "list";}}
好的,如果你認真看了上面的代碼的話,你會發現執行個體化spring的方法有兩個,但是到底哪個好,我也不知道,反正兩個取出來的東西是一模一樣的,沒有什麼區別
Struts2擷取request三種方法
struts2裡面有三種方法可以擷取request,最好使用ServletRequestAware介面通過IOC機制注入Request對象。
在Action中擷取request方法一:
在Action中的代碼:
Map request =(Map)ActionContext.getContext().get("request");
List<Task> tasks = taskManager.findAll();
request.put("tasks", tasks);
在JSP頁面中擷取其中的值:
<s:iterator id="task"value="#request.tasks">
<trclass="table_header">
<td><s:propertyvalue="#task.tname"/></td>
<td><s:propertyvalue="#task.tuid"/></td>
<td><s:propertyvalue="#task.tstartTime"/></td>
<td><s:propertyvalue="#task.tendTime"/></td>
<td><s:propertyvalue="#task.tstate"/></td>
<td><inputtype="radio" id="choose" name="choose"onclick="getId(this.value)" value="<s:propertyvalue=‘#task.tid‘/>"/></td>
</tr>
</s:iterator>
--------------------------------------------------------------------------------------------
方法二:通過ServletActionContext類來擷取,使用struts2經驗如果處理get傳參是中文,只能使用該方法進行處理亂碼問題
Action中代碼:
HttpServletRequest request =ServletActionContext.getRequest();
request.setAttribute("username","zhangsan");
在jsp中擷取其中的值
<s:propertyvalue="#request.username">或者${requestScope.req}
--------------------------------------------------------------------------------------------
方法三:通過ServletRequestAware介面通過IOC機制注入Request對象
Action中的代碼:
Action實現ServletRequestAware介面,實現介面中的方法
private HttpServletRequest request;
//實現介面中的方法
public void setServletRequest(HttpServletRequestrequest){
this.request = request;
}
//然後在execute()方法中就可以使用了
public String execute(){
request.setAttribute("username", "zhangsan");
request.getSession().getServletContext().getApplication(); //得到Application
}
該方法必須要實現,而且該方法是自動被調用
這個方法在被調用的過程中,會將建立好的request對象通過參數的方式傳遞給你,你可以用來賦給你本類中的變數,然後request就可以使用了
注意:setServletRequest()方法一定會再execute()方法被調用前執行
4、我們接下來寫一下我們的jsp檔案
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%><%@ taglib prefix="s" uri="/struts-tags" %><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html> <head> <title>SSH之人物列表</title> <meta http-equiv="pragma" content="no-cache"><meta http-equiv="cache-control" content="no-cache"><meta http-equiv="expires" content="0"> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"><meta http-equiv="description" content="This is my page"><!--<link rel="stylesheet" type="text/css" href="styles.css">--> </head> <body> <s:iterator var="persons" value="#request.persons"> id號是:<s:property value="id"/>名字是:<s:property value="name"/><br> </s:iterator> </body></html>
這裡我們來擴充一下Struts2的標籤的知識
struts2標籤使用中,什麼時候用#,什麼時候可以不用#
比如我看有些是這樣寫的:<s:iterator id="page" value="List"></s:iterator><s:iterator id="page" value="#List"></s:iterator>哪位能說的詳細點,不要說在什麼根不根中的,這個糾結了我好久。
值棧中的對象的不使用#,非值棧中的對象使用#如果你不理解值棧的作用,簡單點理解:當前action,或者處於action鏈中的action所擁有的屬性,並且為該屬性提供了getter和setter方法,那麼在jsp中就不需要使用#,除此之外需要使用#,那麼從這裡你就可以知道action的屬性如果提供了getter和setter方法,那麼這些屬性值就會放置到值棧中
struts標籤<s:iterator>怎麼用
把action中的List對象,在頁面用<s:iterator>把List的內容迴圈顯示出來首先有一個User對象public class User { private Integer userId; private String userName; private String userPwd; //get和set方法 ...........}action中的代碼List list = new ArrayList();User user1 = new User();user1.setUserId(1);user1.setUserName("zhangsan");user1.setUserPwd("123456");list.add(user1);User user2 = new User();user2.setUserId(2);user2.setUserName("lisi");user2.setUserPwd("1234");list.add(user2);在把list放在request中,好在jsp頁面中能拿到jsp頁面中的代碼<table><s:iterator value="list" id="別名">//這個id加不加都沒事 <tr> <td><s:property value="user.userId"/></td>//這也可以寫成<s:property value="別名.user.userId"/> <td><s:property value="user.userName"/></td> <td><s:property value="user.userPwd"/></td> </tr></s:iterator></table>這樣就可以了!
參考:
http://zhidao.baidu.com/question/172130287
5、啟動tomcat
開啟http://localhost:8080/ssh/PersonAction(我使用的是tomcat,具體tomcat怎麼搞,就不在這裡囉嗦了)
控制台運行結果:
項目:http://download.csdn.net/detail/cutter_point/8544889
【j2ee spring】9、整合SSH架構(2)