【j2ee spring】9、整合SSH架構(2)

來源:互聯網
上載者:User

標籤: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)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.