1. 程式人生 > >ssh和ssm的對比

ssh和ssm的對比

ssh:一般代指為spring,struts2以及hibernate

ssm:一般代指為spring,springMVC以及mybatis

 

spring:Spring依賴注入來管理各層的元件(控制反轉,IOC)。使用面向切面程式設計AOP管理事物、日誌、許可權等。

struts2與springMVC的對比:

Struts2 和 SpringMVC 控制器(controller)控制檢視和模型的互動機制的不同,

Struts2是Action類級別,SpringMVC是方法級別,直接影響到每一個方法:

struts:

本質:類級別的攔截,對應一個request上下文

每次訪問一個路徑時,例如:localhost:8080/testAction/test.do,即訪問testAction的test的方法:

public class testAction{
/** 首頁*/
	public String test() {
		String menu = request.getParameter("menu");
		if(StringUtils.isBlank(menu)){
			menu = "YEY";
		}
		request.setAttribute("menuFlag", "xcjs");
		request.setAttribute("menuFlag_1", menu);
		return "test.html";
	}
}

springMVC:

而對於springMVC而言:對json的相容十分友善


@Controller
@RequestMapping(value = "testC")
public class TestController {
    @RequestMapping(value="/test",method= RequestMethod.POST)
    @ResponseBody
    public Message test(@RequestBody BaseUser baseUser){
        Message message = new Message();
        try {
            baseUser.setPassword(MD5.getMd5(baseUser.getPassword()));
            message = shiroService.queryUser(baseUser);

        }catch (Exception e){
            message.setMessage("伺服器異常!");
        }


        return message;

    }
}

 

1.struts:

Struts2框架執行步驟(Struts2使用Filter嵌入):

1、客戶端初始化一個指向Servlet容器(例如Tomcat)的請求

2、這個請求經過一系列的過濾器(Filter)(這些過濾器中有一個叫做ActionContextCleanUp的可選過濾器,這個過濾器對於Struts2和其他框架的整合很有幫助

3、接著FilterDispatcher被呼叫,FilterDispatcher詢問ActionMapper來決定這個請求是否需要呼叫某個Action

4、如果ActionMapper決定需要呼叫某個Action,FilterDispatcher把請求的處理交給ActionProxy

5、ActionProxy通過Configuration Manager詢問框架的配置檔案,找到需要呼叫的Action類

6、ActionProxy建立一個ActionInvocation的例項。

7、ActionInvocation例項使用命名模式來呼叫,在呼叫Action的過程前後,涉及到相關攔截器(Intercepter)的呼叫。

8、一旦Action執行完畢,ActionInvocation負責根據struts.xml中的配置找到對應的返回結果。返回結果通常是(但不總是,也可 能是另外的一個Action鏈)一個需要被表示的JSP或者FreeMarker的模版。

9、將處理結果返回給客戶端

2.springMVC:

1、客戶端發出一個http請求給web伺服器,web伺服器對http請求進行解析,如果匹配DispatcherServlet的請求對映路徑(在web.xml中指定),web容器將請求轉交給DispatcherServlet.

2、DipatcherServlet接收到這個請求之後將根據請求的資訊(包括URL、Http方法、請求報文頭和請求引數Cookie等)以及HandlerMapping的配置找到處理請求的處理器(Handler)。

3-4、DispatcherServlet根據HandlerMapping找到對應的Handler,將處理權交給Handler(Handler將具體的處理進行封裝),再由具體的HandlerAdapter對Handler進行具體的呼叫。

5、Handler對資料處理完成以後將返回一個ModelAndView()物件給DispatcherServlet。

6、Handler返回的ModelAndView()只是一個邏輯檢視並不是一個正式的檢視,DispatcherSevlet通過ViewResolver將邏輯檢視轉化為真正的檢視View。

7、Dispatcher通過model解析出ModelAndView()中的引數進行解析最終展現出完整的view並返回給客戶端。

 

2.hibernate和mybatis對比:

1.兩者的相同點

Hibernate與MyBatis都可以是通過SessionFactoryBuider由XML配置檔案生成SessionFactory,然後由SessionFactory 生成Session,最後由Session來開啟執行事務和SQL語句。其中SessionFactoryBuider,SessionFactory,Session的生命週期都是差不多的。

Hibernate和MyBatis都支援JDBC和JTA事務處理。

2.兩者各自優勢

MyBatis可以進行更為細緻的SQL優化,可以減少查詢欄位。

MyBatis容易掌握,而Hibernate門檻較高。

Hibernate和MyBatis都有相應的程式碼生成工具。可以生成簡單基本的DAO層方法。針對高階查詢,Mybatis需要手動編寫SQL語句,以及ResultMap。而Hibernate有良好的對映機制,開發者無需關心SQL的生成與結果對映,可以更專注於業務流程。

Hibernate資料庫移植性很好,MyBatis的資料庫移植性不好,不同的資料庫需要寫不同SQL。

Hibernate有更好的二級快取機制,可以使用第三方快取。MyBatis本身提供的快取機制不佳,更新操作不能指定重新整理指定記錄,會清空整個表,但是也可以使用第三方快取。

Hibernate 封裝性好,遮蔽了資料庫差異,自動生成SQL語句,應對資料庫變化能力較弱,SQL語句優化困難。

Hibernate的查詢會將表中的所有欄位查詢出來,這一點會有效能消耗。Hibernate也可以自己寫SQL來指定需要查詢的欄位,但這樣就破壞了Hibernate開發的簡潔性。而Mybatis的SQL是手動編寫的,所以可以按需求指定查詢的欄位。

mybaits通過mapper.xml維護對映結果,程式設計師手動編寫sql相比hibernate自動生成hql(hibernate sql)更加靈活,sql調優更加容易(hibernate因為更好的封裝性,開發效率提高的同時,sql語句調優要更費力,當然可以手動修改sql來優化,但是同時也會影響開發效率);hibernate的hql資料庫移植性更好,體現在強壯性。hibernate在級聯刪除的時候效率低;資料量大, 表多的時候,基於關係操作會變得複雜。