精品伊人久久大香线蕉,开心久久婷婷综合中文字幕,杏田冲梨,人妻无码aⅴ不卡中文字幕

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
用一天的時間學習Java EE中的SSH框架

    首先說明一下,本人目前主要從事.NET領域的工作,但對于C++、Java、OC等語言也略知一二,周末閑來無事,特花費一天的時間學習了一下Java中的SSH框架,希望把學習過程中的心得體會與園友們進行分享,共勉之。

    SSH框架主要是指Struts、Spring、Hibernate,其中Struts主要擅長Java EE開發中的MVC模式,其優點主要體現的視圖和控制器的解耦上,Spring主要擅長于IOC(依賴注入)和AOP(面向切面的編程),主要是為了解決企業應用程序維護的復雜性問題成創立的,Hibernate是一個非常出色的ORM框架,擁有強大的一級二級緩存機制結合數據庫連接池(POOL),大大提高CURD的操作效果,項目加入了Hibernate以后,還可以更好地進行面向對象的編程。

    一、Struts

    首先介紹Struts,在Web項目中加入Struts的jar包,并在Web.xml中添加 Struts的配置:

<filter>
      <filter-name>struts2</filter-name>
      <filter-class>
          org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
      </filter-class>
  </filter>
  <filter-mapping>
      <filter-name>struts2</filter-name>
      <url-pattern>/*</url-pattern>
  </filter-mapping>

    其中filter是指對用戶請求的攔截,url-pattern中的/*是指使用Struts對所有的請求進行攔截。接著創建一個Login.jsp,源碼如下:

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ page isELIgnored="false" %>
<%@ taglib uri="/struts-tags" prefix="s"%>  

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>用戶登錄</title>
    
    <meta http-equiv="pragma" content="no-cache">
    <meta http-equiv="cache-control" content="no-cache">
    <meta http-equiv="expires" content="0">    
  </head>
  
  <body>
      <s:form action="Login.action" method="post">
        <s:textfield name="UserName" label="賬號">
          </s:textfield>
  
          <s:password name="Password" label ="密碼">
          </s:password>
          <s:submit value="登錄"></s:submit>
      </s:form>
 </body>
</html>

    其中的【s:】的的標簽是由Struts的標簽庫提供的,Struts中提供了一個非常強大的標簽庫,利用這些標簽庫可以輔助開發者進行HTML的表單設計和一些業務邏輯控制,form標簽中的action指向的是我們的控制器,默認是以.action結尾,我們添加一個控制器類,用于處理用戶的登錄請求,命名為Login.java,源碼如下:

package account;

import com.opensymphony.xwork2.Action;
import com.opensymphony.xwork2.ActionSupport;

public class Login extends ActionSupport {
    public String UserName;
    public String Password;
    public String getUserName() {
        return UserName;
    }
    public void setUserName(String userName) {
        UserName = userName;
    }
    public String getPassword() {
        return Password;
    }
    public void setPassword(String password) {
        Password = password;
    }
    
    //對表單進行驗證
    @Override
    public void validate() {
        if(UserName.equals(""))
        {
            this.addFieldError("UserName", "用戶名不允許為空!");
        }
        if(Password.equals("")){
            this.addFieldError("Password", "密碼不能為空!");
        }
    };
    //執行控制器邏輯
    public String execute()
    {
        if(UserName.equals("admin") && Password.equals("123")){
            return Action.SUCCESS;
        }
        else {
            return Action.ERROR;
        }
    }
}

    其中Login的類繼承自ActionSupport,ActionSupport類實現了Struts的Action的接口,并且還具有了對表單進行驗證的功能,在Login中重寫alidate就可以對表單進行驗證,在出錯的時候,添加錯誤信息。execute相當于控制器的“main”函數,其必須為public類型,并且返回值為String,在本例中返回的結果為Action中的5個字符常量之一(當然,也可以自定義返回接口)。

    接下來在src的目錄下對struts.xml添加相應的配置,把控制器和我們的jsp文件關聯起來,配置的代碼如下:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd">
<struts>
<package name="ghyStruts" extends="struts-default">
<action name="Login" class="account.Login">
    <result name="success" type="redirectAction">
    <param name="username">${UserName}</param>
    <param name="actionName">index</param>
    </result>
    <result name="error">/error.jsp</result>
    <result name="input">Login.jsp</result>
</action>

<action name="index" class="home.index">
    <result name="index">/index.jsp</result>
</action>
</package>
</struts>    

    其中的action代表了一個控制器請求,result是指請求返回的結果(控制器類中的execute方法的返回值),其中的name與返回的字符串必須要對應起來,type="redirectAction"代表跳轉到另外一個action中,還可以在跳轉的時候,添加參數,參數的名稱、值和跳轉結果的action的名字都是由param指定。如果需要直接返回到另外一個jsp頁面,可以直接在result中添加jsp的名字,如/error.jsp,其中的“/”代表根目錄。

     Struts中提供了大量的標簽庫,標簽庫中的所有的標簽頭都是以s開頭,格式為s:xxx,以其中的控制標簽if為例:

<s:if test="UserName=='admin'">您好,管理員!</s:if>
<s:else>您好,普通用戶!</s:else>

    其中test是判斷條件,UserName為控制器返回的屬性,里面的內容是條件為真時的結果。

    二、Spring

    下面來介紹一些Spring框架實現的IoC,首先添加一個接口IService,代碼如下:

package lizon;

public interface IService {
    public void save();
}

    再添加一個Service類實現該接口:

package service;

import lizon.IService;

public class Service implements IService {
    public void save() {
        System.out.println("保存");
    }
}

    添加一個Run,來調用接口的save:

package lizon;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import service.Service;

public class Run {
    private IService isvc;
    public IService getIsvc() {
        return isvc;
    }
    public void setIsvc(IService isvc) {
        this.isvc = isvc;
    }
    public static void main(String[] args) {
        
    }
}

    注意,我們的Run類中有一個IService接口的屬性,接下來,我們通過Spring的配置,把Service注入到IService中:

<?xml version="1.0" encoding="UTF-8"?>
<beans
    xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:p="http://www.springframework.org/schema/p"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd">

    <bean id="svc" class="service.Service">
    </bean>
    
    <bean id="run" class="lizon.Run">
        <property name="isvc" ref="svc"></property>
    </bean>
</beans>

    首先配置一個Service的bean,并給它的實例起個名字叫svc,然后配置一個run的bean,并把svc的實現,注入到Run類中的IService接口中。這樣在Run的main方法中,我們就可以這樣調用:

ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
Run run = (Run) context.getBean("run");
run.isvc.save();

    通過ApplicationContext來獲得配置文件中的接口的實現,然后進行調用。在我們的Run方法中沒有涉及到任何實現的代碼,有效地對接口和實現進行了解耦。Spring框架可以注入多種數據類型,包括基本數據類型、null類型、List、Map、Set等,還可以對構造函數進行注入。并且在配置文件中改變scope的屬性,可以輕松地實現單例模式(Singleton)或多實例模式(Prototype)。

    Spring中還有另一個擅長的領域:AOP,下面來介紹一下在Spring中AOP的實現方法,借用上面例子中的接口和實現,代碼如下:

package lizon;

public interface IService {
    public void save();
}
package service;

import lizon.IService;

public class Service implements IService {
    public void save() {
        System.out.println("保存");
    }
}

    假如這個接口和實現是我們系統中多年前完成的功能模塊,現在我們想在save方法中加入執行前后的日志,但是根據軟件設計中對修改關閉、對擴展開放的原則,我們不應該直接修改save方法,而是使用AOP對save方法進行擴展,下面定義一個基于Spring的對方法進行增強的類:

package Interceptor;

import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;

public class mylog implements MethodInterceptor{

    @Override
    public Object invoke(MethodInvocation arg0) throws Throwable {
        System.out.println("方法執行前");
        arg0.proceed();
        System.out.println("方法執行后");
        return null;
    }

}

    我們定義的這個mylog的類繼承自Spring中的MethodInterceptor,并重寫了該類中的invoke方法,其中arg0.proceed()是執行被代理的方法,并在執行的前后加入了自定義的日志,最后我們配置一個Spring,讓這個增強的方法和原方法關聯起來:

<?xml version="1.0" encoding="UTF-8"?>
<beans
    xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:p="http://www.springframework.org/schema/p"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd">

    <bean id="svc" class="service.Service">
    </bean>
    
    <bean id="mylog" class="Interceptor.mylog"></bean>
    
    <bean id="myproxy" class="org.springframework.aop.framework.ProxyFactoryBean">
        <property name="proxyInterfaces">
            <value>lizon.IService</value>
        </property>
        
        <property name="target" ref="svc"></property>
        
        <property name="interceptorNames">
            <list>
            <value>mylog</value>
            </list>
        </property>
    </bean>

</beans>

    在這個配置文件中,首先定義了接口的實現svc和代理類mylog,然后配置代理的接口,proxyInterfaces里面的value是我們需要增強的接口,target中的ref是接口的實現,interceptorNames中配置我們使用哪一個代理類。調用方法如下:

public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
        IService isvc = (IService) context.getBean("myproxy");
        isvc.save();
    }

    三、Hibernate

    最后介紹一下Hibernate,首先用數據庫腳本創建一個User表:

CREATE TABLE USER
(
    USERID INTEGER NOT NULL PRIMARY KEY, 
    USERNAME VARCHAR(12) NOT NULL, 
    PASSWORD VARCHAR(50) 
);

    接著創建一個User類:

package lizon;

public class User {
    private int userid;
    private String username;
    private String password;
    public int getUserid() {
        return userid;
    }
    public void setUserid(int userid) {
        this.userid = userid;
    }
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
    
    
}

    再創建一個User.hbm.xml把User類和USER表關聯起來:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
        '-//Hibernate/Hibernate Mapping DTD 3.0//EN'
        'http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd'>
<hibernate-mapping>
    <class name="lizon.User" table="USER">
        <id name="userid" column="USERID">
            <generator class="increment"/>
        </id>
        <property name="username" column="USERNAME"></property>
        <property name="password" column="PASSWORD"></property>
    </class>
</hibernate-mapping>

    添加一段代碼看一下Hibernate是怎么跟數據交互的:

package lizon;

import hb4.HibernateSessionFactory;

import org.hibernate.Session;

public class Run {
    public static void main(String[] args) {

        Session session = null;  
        try{  
            //取得Session
            session = HibernateSessionFactory.getSession();  
            //開啟事務處理 
            session.beginTransaction();  
            //新增一個User,這時候對象是瞬時狀態
            User user = new User();
            user.setUsername("lizon");  
            user.setPassword("123");  

            //保存User對象 ,這時候對象是持久化狀態 
            session.save(user);  
            //提交事務  
            session.getTransaction().commit();  
        }catch(Exception e){  
            e.printStackTrace();  
            //回滾事務  
            session.getTransaction().rollback();  
        }finally{  
            if(session != null){  
                if(session.isOpen()){  
                    //關閉session,這時候的對象是游離狀態
                    session.close();  
                }  
            }  
        }  
    }
}

    在這段代碼中,我們首先實例化了一個新的User對象,然后使用Hibernate的Session把對象保存到了數據庫,甚至還包含了一個事務處理,在這中間,我們沒有使用任何的sql語句,僅僅對User對象進行操作就可以持久化到數據,使用Hibernate減少了大量的重復JDBC的代碼,可以更好地實現面向對象的編程,當然,這里介紹的只是Hibernate的冰山一角,由于篇幅有限,對于Hibernate的外鍵關聯、延遲加載、HQL等有興趣的話可以自行學習。

    由于對SSH框架接觸時間不長(僅一天時間,囧),難免有不周的地方,還望各位且看且珍惜。

本站僅提供存儲服務,所有內容均由用戶發布,如發現有害或侵權內容,請點擊舉報
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
簡單的struts+spring+hibernate配置實例
Struts2+Spring+Hibernate
SSH框架整合示例
jqGrid基礎學習:3jqGrid與后臺的交互(基于struts2) | 曾華水的博客
Structs Spring Hibernate快速入門
整合之道
更多類似文章 >>
生活服務
分享 收藏 導長圖 關注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點擊這里聯系客服!

聯系客服

主站蜘蛛池模板: 星座| 南城县| 瑞昌市| 轮台县| 宁南县| 子洲县| 西青区| 大田县| 汶川县| 武冈市| 宁蒗| 河曲县| 山阳县| 巫山县| 夏河县| 岑溪市| 泸西县| 子长县| 伊宁市| 喜德县| 灵石县| 台湾省| 巴林右旗| 遵化市| 竹山县| 宜川县| 德惠市| 宁德市| 柳江县| 新平| 雷山县| 龙胜| 东城区| 黄陵县| 资溪县| 舟曲县| 涿州市| 徐水县| 贵德县| 元阳县| SHOW|