Eclipse手動搭建SSH框架

項目地址:https://github.com/pifutan/PifutanSSH

總結:

Struts、Spring、Hibernate三者都是開源框架,框架越來越大,功能也越來越多,有一些沒有遇到過的坑肯定還有很多,遇到了再解決了。官網上有很多說明,但是有些東西不熟悉找起來很麻煩,如果遇到難辦的坑,就到官網上找答案吧,其實官網文檔一般都有寫到(雖然可能有點難找),再不行就需要去閱讀源代碼了。而且現在SSH框架慢慢用得少了,SSM可能更多,因爲SSM更加輕量級。

注意事項:

如果覺得網頁有問題就清理一下瀏覽器的緩存數據和tomcat的緩存數據(右擊tomcat然後clean就可以了)。
tomcat下html文件加載js和css等,用相對路徑的話需要加上Project名,否則路徑不對找不到,使用chrome的開發者工具即可看出。

環境:

Windows10+JDK1.8+Tomcat8+Eclipse Oxygen JavaEE+MySQL57

Struts框架(攔截器和標籤)

  • Struts下載:http://struts.apache.org Struts官網的下載不難找,下一個all和min-lib即可。
  • 使用Eclipse Oxygen JavaEE創建Dynamic
    Web項目,需要勾選web.xml,配置tomcat8和jdk8,注意eclipse版本、tomcat版本、jdk版本可能會有兼容問題,需要對應版本。
  • 教程:http://www.yiibai.com/struts_2/
    入門例子:http://www.cnblogs.com/qulianqing/p/6627746.html
  • 導入min-lib下的jar文件到WebContent/WEB_INF/lib下:
    commons-fileupload-1.3.3.jar
    commons-io-2.5.jar
    commons-lang3-3.6.jar
    freemarker-2.3.23.jar
    javassist-3.20.0-GA.jar
    log4j-api-2.8.2.jar
    ognl-3.1.15.jar
    struts2-core-2.5.13.jar
  • 配置web.xml加入Struts的<filter><filter-mapping>配置解析的類路徑和匹配模式,這裏解析爲struts的,web.xml中的filter和filter-mapping中的org.apache.struts2.dispatcher.filter包下含4個類,一般用一個StrutsPrepareAndExecuteFilter即可。如果出現直接用瀏覽器瀏覽html文件,但是eclipse中用tomcat執行卻又亂碼可以在web.xml中來配置打開文件的方式以及編碼。
  • 創建struts.xml,需要在src文件夾下,如果struts.xml文件配置出現錯誤,那麼解析時出錯,就會包404 not found錯誤。
  • struts.xml中devMode爲true時對應爲開發模式devMode,而爲false是爲產品模式proMode,devMode會提供日誌和debug等信息,並且開發模式下有:
    1、每次請求都會重新加載資源文件,所以當對properties文件進行修改後,下一次請求是就能夠反映相應的變化。(struts.i18n.reload = true也可以達到相同的效果) 2、每次請求的時候也會重新加載xml配置文件、驗證文件等,這樣可以方便調試或者修改相應的配置文件,而不用重新部署重啓web服務器。(struts.configuration.xml.reload = true 也可以達到相同的效果) struts.xml中package的namespace可以指定訪問路徑中加一個namespace,且name不能重名,但是此時action中的html和jsp等文件的路徑也相較於項目路徑多了一層namspace,extends一般要繼承自struts-default。
  • 創建Action:
  • 方式1:普通的java類中定義public String
    execute()方法返回”success”,然後在struts.xml中聲明action,其class需要包名加類名,execute爲默認的method,當然method也可以指定到其他方法上,name是路徑訪問時的名字。
    方式2:java類實現Action接口,並且重寫execute,然後在struts.xml中配置,其實和方式1沒啥區別,只能能夠直接返回SUCCESS而不用自己寫“success”了而已,可指定method。
    方式3:java類繼承自ActionSupport,然後重寫execute,然後在struts.xml中配置,和方式2沒啥區別,也可指定method。
    方式4:使用註解的方式,不用再struts.xml中配置。需要導入struts2-convention-plugin-2.5.13.jar以及asm-5.2.jar、asm-commons-5.2.jar、asm-tree-5.2.jar包,struts.xml中加入如<constant name="struts.convention.action.packages" value="com.pifutan.action" />進行掃描的根包,該包會被掃描成action。java類繼承ActionSupport,然後在方法前添加註解如@Action(value="test41", results=@Result(name="success", location="/index.html")})即可訪問,但是註解方式和配置方式只能使用其中一種,而且註解的優先,配置的顯示The origin server did not find a current representation for the target resource or is not willing to disclose that one exists.注意:導入了註解的包之後,默認的execute方法對應的action name就會顯示沒有設置result success,但是類中其餘方法action還是正常的。
  • Action返回json:
  • 配置struts.xml方式:需要導入struts2-json-plugin-2.5.13.jar包,當然具體版本可有不同只要兼容就好,在struts.xml中配置action需要在extends=”json-default”的package下,默認會返回所有get方法的屬性,不論有沒有這個屬性。
  • 註解方式:同樣需要導入struts2-json-plugin-2.5.13.jar包,類前需要添加註解@ParentPackage("json-default"),方法前添加註解如:@Action(value="actionName",results={@Result(type="json",params= {"key1","value1","key2","value2"})}),其中value爲類中get方法後的value返回值,如果沒有,則不返回該key和value。
  • Action請求格式設置爲json:@InterceptorRef("json")
  • 靜態資源排除:<constant name="struts.action.excludePattern" value="/WEB-INF/statics/.*?" />
  • Struts理解:核心功能都是使用攔截實現“值棧”的概念,OGNL表達式(對象圖形導航語言)和Struts2標籤來解決應用程序數據,很多註解和約定,使這個框架更加易於使用。值棧:存儲機制,類似於域對象,是值棧,可以存值和取值,在action裏面把數據放到值棧裏面,在頁面中獲取到值棧的數據。
  • Struts框架特性:POJO形式和POJO動作;Tag支持;AJAX支持;容易整合(Spring、Tiles、SiteMesh等);模板支持;插件支持;概要分析(集成調試);標籤修改容易(可用FreeMarker等);提升更少的配置(默認配置);

Spring框架(反轉控制IOC也稱依賴注入DI,AOP)

  • 概念區分:Spring 是一個“引擎” ,Spring MVC 是基於 Spring 的一個 MVC 框架,Spring Boot 是基於Spring4 的條件註冊的一套快速開發整合包。Spring 最初利用“工廠模式”( DI )和“代理模式”( AOP)解耦應用組件。大家覺得挺好用,於是按照這種模式搞了一個 MVC 框架(一些用 Spring 解耦的組件),用開發 web 應用(SpringMVC )。然後有發現每次開發都要搞很多依賴,寫很多樣板代碼很麻煩,於是搞了一些懶人整合包( starter ),這套就是Spring Boot。Spring Boot extends SpringMVC extends Spring。
  • 下載:spring.io中的Spring
    FrameWork便是spring,官網有說怎麼下載:http://repo.spring.io/release/org/springframework/spring/
    下載-dist.zip即可。
  • 教程:http://www.yiibai.com/spring/
  • 需要的包:
    commons-logging-1.2.jar(下載:
    http://commons.apache.org/proper/commons-logging/index.html) spring-aop-4.3.9.RELEASE.jar spring-aspects-4.3.9.RELEASE.jar
    spring-beans-4.3.9.RELEASE.jar spring-context-4.3.9.RELEASE.jar
    spring-context-support-4.3.9.RELEASE.jar
    spring-core-4.3.9.RELEASE.jar spring-expression-4.3.9.RELEASE.jar
    spring-instrument-4.3.9.RELEASE.jar
    spring-instrument-tomcat-4.3.9.RELEASE.jar
    spring-jdbc-4.3.9.RELEASE.jar spring-jms-4.3.9.RELEASE.jar
    spring-orm-4.3.9.RELEASE.jar spring-oxm-4.3.9.RELEASE.jar
    spring-test-4.3.9.RELEASE.jar spring-tx-4.3.9.RELEASE.jar
    spring-web-4.3.9.RELEASE.jar spring-webmvc-4.3.9.RELEASE.jar
    spring-webmvc-portlet-4.3.9.RELEASE.jar
    spring-websocket-4.3.9.RELEASE.jar
  • Spring的控制反轉實際上就是Class用配置成bean的方式來管理,否則每次我們都得自己寫清楚,改動時很麻煩且容易出錯還耗時。
  • 聲明爲bean的Class可以有兩種方式,一種是在applicationContext.xml中配置:
<bean id="helloWorld" class="com.pifutan.spring.HelloWorld"></bean>

,另一種是使用組件自動掃描。

  • 組件自動掃描:使用@Component需要配置applicationContext.xml:
    實際上有四種方式:
    @Component – 指示自動掃描組件。 @Repository – 表示在持久層DAO組件。 @Service –
    表示在業務層服務組件。 @Controller – 表示在表示層控制器組件。
    但是這四種方式實際上是一樣的,且都是開啓component-scan就可以了,只是爲了方便閱讀弄出了四種而已。
  • 過濾器組件自動掃描,即不使用如@Component就可以用了。 可以使用包含和不包含兩種過濾。
<context:component-scan base-package="com.pifutan" >
        <context:include-filter type="regex" 
        expression="com.pifutan.dao.*DAO.*" />
        <context:include-filter type="regex" 
        expression="com.pifutan.service.*Service.*" />
        <context:exclude-filter type="regex" 
        expression="com.pifutan.service.*Service.*" />
</context:component-scan>
  • List,Set,Map,Properties和Date注入,都有相應支持和使用。
  • 在Spring中,bean作用域用於確定哪種類型的 bean
    實例應該從Spring容器中如何返回給調用者。bean支持的5種範圍域scope: 單例singleton - 每個Spring IoC
    容器返回同一個bean實例 原型prototype - 當每次請求時返回一個新的bean實例 請求request -
    返回每個HTTP請求的一個Bean實例 會話session - 返回每個HTTP會話的一個bean實例 全局會話global
    session - 返回全局HTTP會話的一個bean實例 在大多數情況下,可能只處理了 Spring 的核心作用域 -
    單例和原型,默認作用域是單例。 注:意味着只有在一個基於web的Spring ApplicationContext情形下有效!
  • 如果需要同一個類的兩個單例,則可以聲明不同的兩個beanid,使用@Qualifier(“personA”)自動裝配。
  • 聲明IUser接口然後User和Admin都實現IUser接口,並且User和Admin都在xml中配置bean或者在類@Component(“beanid”),使用的時候聲明IUser user則會匹配User,聲明IUser admin則會匹Admin,如果找不到beanid且接口只有一個實現時能匹配,如果有多個實現則會報錯多個匹配。如果是使用過濾器自動掃描組件,則類名和變量名對應即可(大小寫無區別)。
    當然IUser需要加@Autowired自動裝配,使用@Autowired需要在applicationContext.xml中添加<context:annotation-config />
  • 配置bean使用new方式實例化是無法填充內部的類變量的。需要:ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");(User) context2.getBean("user");
  • Spring EL表達式,就是可以定義按一定條件和形式注入值。用到的時候再詳細學吧。
  • @Required以及@Mandatory 定製 @Required-style 註解,相當於@Required註解。
  • Spring提供了JDBC支持,提供了JdbcTemplate和JdbcDaoSupport以及SimpleJdbcTemplate。
  • Spring
    AOP:Advice(指示之前或方法執行後採取的行動),Pointcut(指明哪些方法應該攔截,通過方法的名稱或正則表達式模式),Advisor(分組”通知”和”切入點“成爲一個單元,並把它傳遞到代理工廠對象)。
  • Spring AOP+ AspectJ:注意Spring AOP 中沒有 AspectJ 支持 常見AspectJ的註解: @Before – 方法執行前運行 @After – 運行在方法返回結果後 @AfterReturning – 運行在方法返回一個結果後,在攔截器返回結果。 @AfterThrowing – 運行方法在拋出異常後, @Around – 圍繞方法執行運行,結合以上這三個通知。

Hibernate框架(ORM(對象關係映射)以及事務)

  • Hibernate框架簡化了java應用程序與數據庫交互的開發。 Hibernate是一個開源,輕量級的ORM(對象關係映射)工具。
    ORM工具簡化了數據創建,數據處理和數據訪問。它是將對象映射到數據庫中存儲的數據(表)的編程技術。
  • 優點:開源和輕量級,快速性能,數據庫獨立查詢,自動創建表,簡化複雜連接,提供查詢統計和數據庫狀態。
  • Hibernate架構包括許多對象持久對象,會話工廠,事務工廠,連接工廠,會話,事務等。Hibernate架構中有4層Java應用層,hibernate框架層,反手api層和數據庫層。
  • 下載:http://hibernate.org/orm/releases/
    MySQLConnector下載:https://dev.mysql.com/downloads/connector/j/
  • 教程:http://www.yiibai.com/hibernate/
  • 需要的包: mysql-connector-java-5.1.44-bin.jar antlr-2.7.7.jar
    classmate-1.3.0.jar dom4j-1.6.1.jar
    hibernate-commons-annotations-5.0.1.Final.jar
    hibernate-core-5.2.11.Final.jar hibernate-jpa-2.1-api-1.0.0.Final.jar
    jandex-2.0.3.Final.jar javassist-3.20.0-GA.jar
    jboss-logging-3.3.0.Final.jar
    jboss-transaction-api_1.2_spec-1.0.1.Final.jar
  • 首先在MySQL中創建相應的表,在代碼中創建相應的實體類,可以用table.hbm.xml或者用註解的方式來映射數據庫中的表,使用javax.persistence.下的@Entity@Table(name=”tablename”)@Id。
  • Hibernate生成器類,包括assigned,increment,sequence,hilo,native,identity,seqhilo,uuid,guid,select,foreign,sequence-identity。
  • 使用Log4j日誌,使用log4j.xml或log4j.properties,下載地址:https://logging.apache.org/log4j/
  • 集合映射,使用xml。
  • HQL: 查詢,它是一個面向對象的Hibernate Query表示。
    Query的對象可以通過Session接口調用createQuery()方法。 查詢接口提供了很多方法。下面給出了一些最常用的方法:
    public int executeUpdate() 用於執行更新或刪除查詢。 public List list()
    將關係的結果作爲列表返回。 public Query setFirstResult(int rowno) 指定從哪裏檢索記錄的行號。
    public Query setMaxResult(int rowno) 指定從關係(表)中檢索記錄的行號。 public Query
    setParameter(int position, Object value) 它將該值設置爲JDBC樣式查詢參數。 public
    Query setParameter(String name, Object value) 它將該值設置爲命名查詢參數。
    獲取所有記錄示例: Query query=session.createQuery(“from Emp”);//here
    persistent class name is Emp List list=query.list(); 獲取分頁記錄示例:
    Query query=session.createQuery(“from Emp”);
    query.setFirstResult(5); query.setMaxResult(10); List
    list=query.list();//will return the records from 5 to 10th number
    更新查詢示例: Transaction tx=session.beginTransaction(); Query
    q=session.createQuery(“update User set name=:n where id=:i”);
    q.setParameter(“n”,”Udit Kumar”); q.setParameter(“i”,111); int
    status=q.executeUpdate(); System.out.println(status);
    tx.commit(); 刪除示例: Query query=session.createQuery(“delete from Emp
    where id=100”); //specifying class name (Emp) not tablename
    query.executeUpdate(); 聚合函數:avg(),min(),max() Query
    q=session.createQuery(“select sum(salary) from Emp”); List
    list=q.list(); System.out.println(list.get(0));
  • HCQL:Hibernate標準(Criteria)查詢語言(HCQL)用於根據具體條件獲取記錄。
  • session接口的createCriteria()方法的語法: 常用的Criteria接口方法如下: public Criteria
    add(Criterion c) 用於添加限制(條件)。 public Criteria addOrder(Order o)
    指定排序順序。 public Criteria setFirstResult(int firstResult) 指定要檢索的第一個記錄數。
    public Criteria setMaxResult(int totalResult) 指定要檢索的記錄總數。 public List
    list() 返回包含對象的列表。 public Criteria setProjection(Projection
    projection) 指定投影。 Restrictions類: public static SimpleExpression
    lt(String propertyName,Object value) 將給定屬性的約束設置爲小於約束。 public static
    SimpleExpression le(String propertyName,Object value) 設置給定屬性的小於或等於約束。
    public static SimpleExpression gt(String propertyName,Object value)
    設置給定屬性的大於約束。 public static SimpleExpression ge(String
    propertyName,Object value) 設置給定屬性的大於或等於約束。 public static
    SimpleExpression ne(String propertyName,Object value) 對給定的屬性設置不相於約束。
    public static SimpleExpression eq(String propertyName,Object value)
    設置約束與給定屬性相等。 public static Criterion between(String propertyName,
    Object low, Object high) 設置約束之間範圍。 public static SimpleExpression
    like(String propertyName, Object value) 將類似的約束設置爲給定的屬性。
    Order類:Restrictions 類方法 public static Order asc(String propertyName)
    適用於給定屬性的基礎上,按升序排列。 public static Order desc(String propertyName)
    適用於給定屬性的基礎上,按降序排列。
  • Hibernate緩存:一級緩存和二級緩存。Session對象保存第一級緩存數據,第一級緩存默認情況下啓用。
    第一級緩存數據將不可用於整個應用程序。這是因爲應用程序可以使用很多會話(Session)對象。SessionFactory對象保存二級緩存數據。
    存儲在第二級緩存中的數據將可用於整個應用程序。
    但是我們需要明確地啓用它,這是第二級緩存默認情況下不啓用。二級緩存實現由不同的程序開發者(商)提供。

Struts + Spring + Hibernate框架

  • 搭建Struts框架,導入struts包配置web.xml和struts.xml,將spring和hibernate包導入,另外再導入struts2-spring-plugin-2.5.13.jar包,配置applicationContext.xml,不需要配置hibernate.cfg.xml,在web.xml中配置contextConfigLocation爲applicationContext.xml的路徑且配置Spring監聽器,applicationContext.xml需要配置dataSource、sessionFactory(packagesToScan的property配置掃描的hibernate的表對應的Entity類)、transactionManager、transactionInterceptor(配置一下如save方法權限等)、hibernateTemplate(推薦使用)。
  • jar包:
    antlr-2.7.7.jar
    asm-5.2.jar
    asm-commons-5.2.jar
    asm-tree-5.2.jar
    c3p0-0.9.5.2.jar
    classmate-1.3.0.jar
    commons-fileupload-1.3.3.jar
    commons-io-2.5.jar
    commons-lang3-3.6.jar
    commons-logging-1.2.jar
    dom4j-1.6.1.jar
    freemarker-2.3.23.jar
    hibernate-c3p0-5.2.11.Final.jar
    hibernate-commons-annotations-5.0.1.Final.jar
    hibernate-core-5.2.11.Final.jar
    hibernate-jpa-2.1-api-1.0.0.Final.jar
    jandex-2.0.3.Final.jar
    javassist-3.20.0-GA.jar
    jboss-logging-3.3.0.Final.jar
    jboss-transaction-api_1.2_spec-1.0.1.Final.jar
    log4j-api-2.8.2.jar
    log4j-core-2.9.1.jar
    mchange-commons-java-0.2.11.jar
    mysql-connector-java-5.1.44-bin.jar
    ognl-3.1.15.jar
    slf4j-api-1.7.25.jar
    spring-aop-4.3.9.RELEASE.jar
    spring-aspects-4.3.9.RELEASE.jar
    spring-beans-4.3.9.RELEASE.jar
    spring-context-4.3.9.RELEASE.jar
    spring-context-support-4.3.9.RELEASE.jar
    spring-core-4.3.9.RELEASE.jar
    spring-expression-4.3.9.RELEASE.jar
    spring-instrument-4.3.9.RELEASE.jar
    spring-instrument-tomcat-4.3.9.RELEASE.jar
    spring-jdbc-4.3.9.RELEASE.jar
    spring-jms-4.3.9.RELEASE.jar
    spring-orm-4.3.9.RELEASE.jar
    spring-oxm-4.3.9.RELEASE.jar
    spring-test-4.3.9.RELEASE.jar
    spring-tx-4.3.9.RELEASE.jar
    spring-web-4.3.9.RELEASE.jar
    spring-webmvc-4.3.9.RELEASE.jar
    spring-webmvc-portlet-4.3.9.RELEASE.jar
    spring-websocket-4.3.9.RELEASE.jar
    struts2-convention-plugin-2.5.13.jar
    struts2-core-2.5.13.jar
    struts2-json-plugin-2.5.13.jar
    struts2-spring-plugin-2.5.13.jar
  • 寫了一個BaseAction,其餘Action集成BaseAction,返回json時想要返回父類的屬性可以添加一個參數ignoreHierarchy=false,註解方式爲:@Result(type="json",params=
    {"ignoreHierarchy","false"})
    ,xml方式:<param
    name="ignoreHierarchy">false</param>
  • 類似的屬性還有(值有多個時用逗號隔開):(可參照官網:http://struts.apache.org/docs/json-plugin.html
    excludeProperties, 不包含指定類容的集合
    includeProperties, 包含指定類容的集合
    excludeNullProperties, 是否轉換輸出null值 root, 只返回指定的對象
    wrapPrefix,在json結果前添加符號
    ignoreHierarchy, 是否忽略繼承關係
    enableGZIP, 是否支持gzip壓縮輸出
    statusCode, 設置響應代碼號
    errorCode, 錯誤代碼
    contentType, 輸出類型
    encoding, 編碼
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章