java mvc建包结构_Java SSM框架的配置方法、MVC结构的分析、响应的流程
今天頭一次配置成功一個(gè)SSM框架,興奮之余,還應(yīng)該從使用的角度,將整個(gè)ssm配置的方法,配置的原因,認(rèn)真的分析一下。在結(jié)束了對SSM框架簡單的分析之后,就要開始回歸基礎(chǔ),全面的認(rèn)真復(fù)習(xí)。所以這個(gè)文檔,要盡量的完整,目標(biāo)就是,這個(gè)文檔是是對SSM框架的學(xué)習(xí),也是一個(gè)將來復(fù)習(xí)的資料。
1 RESOURCES 配置文件
1.1 配置文件簡介
這個(gè)部分用來解讀在resources文件夾下的配置信息。這一部分是整個(gè)ssm框架中,最難的一部分,也是最復(fù)雜的一部分。在配置這個(gè)部分的時(shí)候,盡管是不停的膚質(zhì)粘貼,偶爾改一改路徑。但是這樣的一個(gè) 過程要比寫業(yè)務(wù)邏輯代碼麻煩的多。
1.1.1 jdbc.properties
這個(gè)文件是用來保存和數(shù)據(jù)庫連擊的相關(guān)的信息,比如JDBC驅(qū)動(dòng)器、數(shù)據(jù)庫戶名、數(shù)據(jù)庫密碼等等,和數(shù)據(jù)庫相關(guān)的靜態(tài)信息,都會(huì)以KV的形式,保存在這個(gè)文件中。這樣在需要對數(shù)據(jù)庫的信息進(jìn)行改變時(shí),只需要打開這個(gè)文件,就可以對數(shù)據(jù)庫的配置進(jìn)行改變。與之前傳統(tǒng)數(shù)據(jù)庫連接方式相比,在修改時(shí),不用改變多處的信息。
1.1.2 spring-mvc.xml
和名字顯示的顯示的一樣,這是一個(gè)對MVC配置的一個(gè)文件。簡單來講有下面的幾點(diǎn)功能:
1 設(shè)定用來存放controller的包的位置。
2 以文件前綴、后綴的方式,設(shè)定存放JSP文件的路徑。
我對這個(gè)文件的理解為,從controller獲取執(zhí)行哪一個(gè)文件的信息,在將這個(gè)信息,通過前綴和后綴的包裝,傳遞給下一級。
1.1.3 spring-mybatis.xml
這個(gè)配置也常常叫做:applicationContext.xml,但是其實(shí)是一個(gè)東西,都是用來配置mybatis。
1 將標(biāo)注Spring注解的類自動(dòng)轉(zhuǎn)化成Bean,并且完成Bean的注入。
2 配置數(shù)據(jù)庫相關(guān)的資源。
3 配置數(shù)據(jù)庫的sessionFactory
4 配置需要被掃描的用來存放DAO接口的接口包。
5 配置事務(wù)管理器。
1.1.4 UserDAO.xml
mapper.xml稍微好理解一些。就是使用DAO接口的全限定地址,和DAO中的操作數(shù)據(jù)庫的sql方法,封裝起來,那么調(diào)用DAO接口的某個(gè)方法的時(shí)候,就可以使用mapper.xml中封裝的sql語句操作數(shù)據(jù)庫。
通常在這個(gè)文件也叫做mapper.xml文件.
1.1.5 web.xml
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee?http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1">
SSM
SSM_test
encodingFilter
org.springframework.web.filter.CharacterEncodingFilter
encoding
UTF-8
encodingFilter
/*
SpringMVC
org.springframework.web.servlet.DispatcherServlet
contextConfigLocation
classpath:spring-*.xml
1
true
SpringMVC
/
index.html
1.1.6 其他
Logback是一個(gè)關(guān)于log日志的配置文件,并沒有使用sql文件夾。還有就是pom.xml文件,看起來很多,其實(shí)也就是添加了幾個(gè)依賴罷了。
pom.xml<?xmlversion ="1.0"?encoding="UTF-8"?>
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0?http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
com.xzj
ssmSecondTry
1.0-SNAPSHOT
war
ssmSecondTry?Maven?Webapp
http://www.example.com
UTF-8
UTF-8
4.3.5.RELEASE
3.4.1
javax
javaee-api
7.0
junit
junit
4.12
ch.qos.logback
logback-classic
1.2.2
com.fasterxml.jackson.core
jackson-databind
2.8.7
mysql
mysql-connector-java
5.1.41
runtime
com.mchange
c3p0
0.9.5.2
org.mybatis
mybatis
${mybatis.version}
org.mybatis
mybatis-spring
1.3.1
org.springframework
spring-core
${spring.version}
org.springframework
spring-beans
${spring.version}
org.springframework
spring-context
${spring.version}
org.springframework
spring-jdbc
${spring.version}
org.springframework
spring-tx
${spring.version}
org.springframework
spring-web
${spring.version}
org.springframework
spring-webmvc
${spring.version}
org.springframework
spring-test
${spring.version}
ssmSecondTry
org.apache.maven.plugins
maven-compiler-plugin
1.8
1.8
maven-clean-plugin
3.1.0
maven-resources-plugin
3.0.2
maven-compiler-plugin
3.8.0
maven-surefire-plugin
2.22.1
maven-war-plugin
3.2.2
maven-install-plugin
2.5.2
maven-deploy-plugin
2.8.2
logback.xml<?xml ?version="1.0"?encoding="UTF-8"?>
%d{HH:mm:ss.SSS}?[%thread]?%-5level?%logger{36}?-?%msg%n
1.2 JDBC.PROPERTIES
1.2.1 代碼driver?=com.mysql.jdbc.Driver
url?=jdbc:mysql://localhost:3306/mySSM
username?=root
password?=admin97
maxPoolSize?=30
minPoolSize?=10
autoCommitOnClose?=false
checkoutTimeout?=10000
acquireRetryAttempts?=2
1.2.2 代碼解析
前面四行是我們在操作JDBC的時(shí)候,常常操作的四項(xiàng),分別是:驅(qū)動(dòng)器、地址、用戶名、密碼。
第7行設(shè)定最大連接數(shù)為30。最大連接數(shù)是連接池能申請的最大連接數(shù)。如果數(shù)據(jù)連接請求超過此數(shù),后面的數(shù)據(jù)連接請求將被加入到等待隊(duì)列中,這會(huì)影響之后的數(shù)據(jù)庫操作。
第8行設(shè)定最小連接數(shù)為10。最小連接數(shù)是連接池一直保持的數(shù)據(jù)連接。如果應(yīng)用程序?qū)?shù)據(jù)庫連接的使用量不大,將會(huì)有大量的數(shù)據(jù)庫連接資源被浪費(fèi)掉。
第9行設(shè)定在關(guān)閉之后,不會(huì)自動(dòng)執(zhí)行commit。如果設(shè)置為true,那么在數(shù)據(jù)庫的連接狀態(tài)關(guān)閉的時(shí)候,會(huì)將沒有commit的數(shù)據(jù)庫操作,執(zhí)行commit。
第10行設(shè)定連接超時(shí)時(shí)間。
第11行設(shè)定失敗后嘗試的次數(shù)。
這一個(gè)文件的設(shè)置十分明確。并且在它被讀取的時(shí)候,也是以鍵值對的形式被讀取的。
1.2 SPRING-MVC.XML
1.2.1 代碼<?xmlversion ="1.0"?encoding="UTF-8"?>
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd">
1.2.2 代碼解析
在這樣的一個(gè)文件中,第1~11行都是環(huán)境。
第14行設(shè)置存放controller的目錄,在這個(gè)目錄下的類都會(huì)被掃描。
第17行將設(shè)定模式為注解模式,解析base-package目錄下面帶有@Controller注解的類。
第23~27行設(shè)定這個(gè)解析的前綴和后綴,前綴設(shè)定這個(gè)文件的目錄,后綴設(shè)定這個(gè)文件的拓展名。
1.2.3 功能簡析
SpringMVC是View層的一部分,來自于頁面的信息由SpringMVC控制的Controller將請求發(fā)送到Model層中的Service中,然后再M(fèi)odel中處理業(yè)務(wù)邏輯。從Model返回的model,添加上前綴和后綴,傳遞到View層中。
所以,具體的細(xì)分的話,這是一個(gè)介于頁面和Model層之間的模塊:
1 將來自頁面的請求,傳遞到合適的controller。
2 將從controller返回的一個(gè)jsp文件名的字符串,在這里包裝之后,的到下一個(gè)jsp文件的全限定路徑,然后顯示出來。當(dāng)然并不是所有的controller都有返回值,如果沒有,那就是在當(dāng)前的頁面修改。
1.3 SPRING-MYBATIS.XML
1.3.1 代碼<?xmlversion ="1.0"?encoding="UTF-8"?>
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd">
1.3.2 代碼解析
第14行:加上這一行以后,將自動(dòng)掃描路徑下面的包,如果一個(gè)類帶了@Service注解,將自動(dòng)注冊到Spring容器,不需要在spring-mybatis.xml文件定義bean了。類似的注解還有Component、Repository、Controller。
例如:有下面一個(gè)類位于com.xzj.service或其子目錄中:@Service("xxx")
@Scope("yyy")
publicclasstestextendsAimplementsB{
······
}
那么就相當(dāng)于在spring-mybatis.xml添加了一段這樣的。
......
簡而言之,這是一個(gè)將帶有注解的類添加到Spring容器的語句。
第20~30行,創(chuàng)建數(shù)據(jù)庫連接池,讀取jdbc.properties文件中的有關(guān)于數(shù)據(jù)庫的設(shè)置,按照這樣的設(shè)置,設(shè)定數(shù)據(jù)庫連接池的屬性。
1.3.3 功能簡析
縱觀整個(gè)項(xiàng)目,就是這一塊是最復(fù)雜的,在上面的代碼中:
第50行和第38行的bean將DAO接口和mapper連接起來。這樣的配置,使得在使用DAO接口的時(shí)候,直接調(diào)用接口方法,就可以直接調(diào)用DAO.xml中的sql語句。
另外的一點(diǎn)就是注冊了service的目錄,將service的內(nèi)容注冊到了Spring的容器中。也就是說,這個(gè)這個(gè)文件配置了兩個(gè)方面的內(nèi)容:一個(gè)是以service代表的業(yè)務(wù)邏輯,一個(gè)是以DAO及其映射mapper代表的數(shù)據(jù)訪問,這兩者共同組成了Model層。
1.4 WEB.XML
1.4.1 web.xml的代碼<?xmlversion ="1.0"?encoding="UTF-8"?>
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee?http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1">
SSM
SSM_test
encodingFilter
org.springframework.web.filter.CharacterEncodingFilter
encoding
UTF-8
encodingFilter
/*
SpringMVC
org.springframework.web.servlet.DispatcherServlet
contextConfigLocation
classpath:spring-*.xml
1
true
SpringMVC
/
index.html
1.4.2 代碼解析
配置編碼過濾器。
配置分發(fā)器,并且這里的分發(fā)器中,注入了兩個(gè)xml文件。
配置welcome頁面。
2 MVC三層結(jié)構(gòu)的簡析
2.1 MVC的構(gòu)成
2.1.1 M層
M層表示Model層,模型層。用來實(shí)現(xiàn)業(yè)務(wù)邏輯、對數(shù)據(jù)進(jìn)行訪問。
這一層大概分為三個(gè)部分,Model、Service、DAO這樣的三塊,以我創(chuàng)建的這個(gè)工程來講三個(gè)部分分別是:
1 User類,這個(gè)類中有三個(gè)屬性,分別有他們的get、set方法。
2 Service接口及其實(shí)現(xiàn)類。在spring-mybatis.xml中配置,從而被掃描。
3 UserDAO接口,在spring-mybatis.xml中配置,與UserDAO.xml配對,被動(dòng)態(tài)實(shí)現(xiàn)。
即:這層的三個(gè)模塊都是在spring-mybatis.xml中被配置的。
2.1.2 V層
V層表示View層,顯示層。是用來和用戶交互的可視化界面,如html和jsp文件在瀏覽器中的顯示。同樣,在這些顯示頁面中,可以設(shè)定不同的請求,根據(jù)不同的前端動(dòng)作,提交給分發(fā)器。那么這樣的到的響應(yīng)也不同。
2.1.3 C層
C層表示Controller控制器。C層大致上有兩種功能:
1 根據(jù)不同的請求,調(diào)用M層中不同業(yè)務(wù)邏輯處理。
2 得到了來自M層處理結(jié)果的返回,給予V層的顯示結(jié)果也不相同。
這一塊是在spring-mvc.xml配置的。
2.2 M層的具體構(gòu)成
2.2.1 簡述
M層是Model層,負(fù)責(zé)業(yè)務(wù)邏輯和數(shù)據(jù)訪問。以這個(gè)項(xiàng)目為例子,除了controller 以外的Java類和接口都是屬于Model層的的,除此之外還有UserDAO.xml也是屬于Model層的。
2.2.2 User類
User的代碼如下:packagecom.xzj.model;
//?@?author?:zjxu?time:2018/12/31
publicclassUser{
privateintuserID;
privateStringuserName;
privateStringuserPassword;
privateStringcomments;
publicintgetUserID()?{
returnuserID;
}
publicStringgetUserName()?{
returnuserName;
}
publicStringgetUserPassword()?{
returnuserPassword;
}
publicStringgetComments()?{
returncomments;
}
publicvoidsetUserID(intuserID)?{
this.userID=userID;
}
publicvoidsetUserName(StringuserName)?{
this.userName=userName;
}
publicvoidsetUserPassword(StringuserPassword)?{
this.userPassword=userPassword;
}
publicvoidsetComments(Stringcomments)?{
this.comments=comments;
}
@Override
publicStringtoString()?{
return"User{"+
"userID="+userID+
",?userName='"+userName+'\''+
",?userPassword='"+userPassword+'\''+
",?comments='"+comments+'\''+
'}';
}
}
言簡意賅,這一段代碼就是定義一個(gè)User類,并且定義了幾個(gè)域。id、name、password、comments。設(shè)定了它們的getter和setter。
2.2.3 UserService接口packagecom.xzj.service;
importcom.xzj.model.User;
//?@?author?:zjxu?time:2018/12/31
publicinterfaceUserService{
publicUserselectUser(longuserID);
}
申明一個(gè)接口,這個(gè)接口是Model層中的service的接口。它的實(shí)現(xiàn)類,必須實(shí)現(xiàn)在這個(gè)類中定義的方法。其實(shí)這個(gè)接口并不是必須的,在spring-mybatis.xml中,配置的com.xzj.service目錄中直接寫UserServiceImple類,即可將這個(gè)類配置進(jìn)spring中。但是有這個(gè)過接口可以將Model層中的service服務(wù)的結(jié)構(gòu)更加清晰。所以在這個(gè)工程中,就使用了UserService接口。
2.2.4 UserServiceImple 類packagecom.xzj.service.imple;
//?@?author?:zjxu?time:2018/12/31
importcom.xzj.DAO.UserDAO;
importcom.xzj.model.User;
importcom.xzj.service.UserService;
importorg.springframework.stereotype.Service;
importjavax.annotation.Resource;
@Service("userService")
publicclassUserServiceImpleimplementsUserService{
@Resource
privateUserDAOuserDAO;
publicUserselectUser(longUserID)?{
returnthis.userDAO.selectUser(UserID);
}
}
UserService的實(shí)現(xiàn)類,其中兩個(gè)很重要的是兩個(gè)注解11和14行的兩個(gè)注解。 ?第11行的注解@Service("userService”),表示是為userService服務(wù)的,這個(gè)userService是controller的userService類。
2.2.5 UserDAO 接口packagecom.xzj.DAO;
//?@?author?:zjxu?time:2018/12/31
importcom.xzj.model.User;
publicinterfaceUserDAO{
UserselectUser(longid);
}
2.2.5 UserDAO.xmlmapper?PUBLIC?"-//mybatis.org//DTD?Mapper?3.0//EN"?"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
SELECT?*?FROM?userList?WHERE?userID?=?#{id}
2.3 C層的具體構(gòu)成
2.3.1 簡述
C層就是 controller,位于Model層和View層之間的一層。
2.3.2 Controller 類packagecom.xzj.controller;
//?@?author?:zjxu?time:2018/12/31
importcom.fasterxml.jackson.databind.ObjectMapper;
importcom.xzj.model.User;
importcom.xzj.service.UserService;
importorg.springframework.stereotype.Controller;
importorg.springframework.web.bind.annotation.RequestMapping;
importorg.springframework.web.servlet.ModelAndView;
importjavax.annotation.Resource;
importjavax.servlet.http.HttpServletRequest;
importjavax.servlet.http.HttpServletResponse;
importjava.io.IOException;
@Controller
publicclassUserController{
@Resource
privateUserServiceuserService;
@RequestMapping("/showUser.do")
publicvoidselectUser(HttpServletRequestrequest,HttpServletResponseresponse,ModelAndViewmav)?throwsIOException{
request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("UTF-8");
longuserId=Long.parseLong(request.getParameter("id"));
Useruser=this.userService.selectUser(userId);
System.out.println("\n\n\n\n\n\n\n\n\n\n\n\n"+userId+"\n\n\n\n\n\n\n\n\n\n\n\n");
ObjectMappermapper=newObjectMapper();
response.getWriter().write(mapper.writeValueAsString(user));
response.getWriter().close();
}
@RequestMapping("/test")
publicModelAndViewtest(HttpServletRequestrequest,HttpServletResponseresponse)throwsIOException{
ModelAndViewmav=newModelAndView();
mav.addObject("name",?"SpringMVC");
mav.setViewName("test");
returnmav;
}
}
2.3.3 Controller層注解的詳細(xì)分析
在controller中,重要的地方在于這幾個(gè)注解。controller、Resource、RequestMapping這單個(gè)注解。
1 注解@Controller。
表明這是一個(gè)Controller類,spring-mvc.xml文件設(shè)定的掃描目錄下被掃描。
2 注解@Resource。
這個(gè)注解放在UserService的申明的前一行。它聲明一個(gè)名為userService的對象,并且這個(gè)對象的類型為UserService接口的實(shí)現(xiàn)類。
通過@Resource注解,可以在service目錄下UserServiceImple類中找到帶有一個(gè)@Service("userService”)的注解,找到的注解中的變量名和這個(gè)注解下一行聲明的對象的變量名是一致的。
在service目錄下找到的那個(gè)類前面的注解表明在controller中的申明的對象的具體類型的UserServiceImple,它實(shí)現(xiàn)了UserService這個(gè)接口。
也就是說,@Service(“userService”)注解的類,為@Resource下一行的名為userService的對象服務(wù)。而它們一個(gè)位于service目錄下,一個(gè)位于controller目錄下。這兩個(gè)目錄都被添加到了spring-*.xml中。這樣的對應(yīng)關(guān)系,是屬于兩個(gè)層的
3 注解@RequestMapping
參數(shù)類型為一個(gè)字符串。這個(gè)參數(shù)的意義是從controller來的除了項(xiàng)目以外的三級及以下的URL地址。比如:http://localhost:8080/ssm/test
這樣的一個(gè)地址,經(jīng)過分發(fā)器,來到了controller,controller會(huì)根據(jù)除了localhost/ssm/之外的地址,調(diào)用不同的方法。在controller這端,就會(huì)將后面的這段url地址通過注解,標(biāo)記在方法上,或者是類上面。以這個(gè)url來看,它就會(huì)調(diào)用UserController.test(request,response)方法。
注解的位置的區(qū)別在于:
<1> 類的上方?jīng)]有注解的時(shí)候,這個(gè)類的下面所有的方法的注解都需要添加參數(shù)。當(dāng)然,也不是所有的方法都需要有注解。
但是只要是存在的注解都需要有參數(shù)。否則這樣寫的controller方法,作出的效果將會(huì)是“l(fā)ocalhost:8080/ssm”的結(jié)果,這樣welcome頁面將會(huì)失效。
<2> 類的上方存在注解,那么這個(gè)注解會(huì)成為這個(gè)一個(gè)上級字符串加在類中的方法上的字符串上。就如同java的package的目錄一樣。com.xzj.test這樣子,只不過在這里是用’/’來連接。
2.4 V層的具體構(gòu)成
V層是直接面對用戶的頁面。所以在V層中,寫的代碼都是面向用戶的操作的,盡管有一部分和請求相關(guān),但是絕大部分還是于頁面的展示相關(guān)的。
2.4.1 index.html文件html>
testfunctionselectUser()?{
varxmlhttp=newXMLHttpRequest();
xmlhttp.onreadystatechange=function()?{
if(xmlhttp.readyState==4&&xmlhttp.status==200)?{
document.getElementById("test").innerHTML=xmlhttp.responseText;
}
}
xmlhttp.open("POST",?"showUser.do",?true);
xmlhttp.setRequestHeader("Content-type",?"application/x-www-form-urlencoded");
xmlhttp.send("id=100");
}
Hello?World!
onclick?test
ThisIsALinkForTest
這段html代碼,其中的重點(diǎn)在于javascript代碼中的Ajax掌握。
這段短短的javascript,發(fā)起請求,獲得響應(yīng),設(shè)定顯示,完成這三個(gè)工作。
按鈕-響應(yīng),這一塊非常基礎(chǔ)的前端應(yīng)用,主要的問題來自于響應(yīng)方法中的Http請求。關(guān)于javascript的代碼邏輯,雖然一眼就能明了,但是,還是要仔細(xì)研究一下ajax如何在html文件中,更加精巧的應(yīng)用。
對于這個(gè)連接,就是在點(diǎn)擊之后,會(huì)跳轉(zhuǎn)到顯示/WEB-INF/views/test.jsp相當(dāng)于一個(gè)請求controller,并通過controller的到一個(gè)“test”的字符串,將其包裝成為了一個(gè)完整的路徑,在View層顯示。
2.4.2 jsp目錄及其下的test.jsp文件
CreatedbyIntelliJIDEA.
User:?thisxzj
Date:?2019/1/1
Time:?23:45
TochangethistemplateuseFile|Settings|FileTemplates.
--%>
xxxtest
我新建的項(xiàng)目是${name}
這個(gè)jsp的路徑是/WEB-INF/views/test.jsp,在從controller中返回一個(gè)字符串,比如一個(gè)“test”串,或者是modelAndView.setViewName("test”),并將其返回。
就會(huì)通過spring-mvc.xml中的下兩行,將其包裝成/WEB-INF/views/test.jsp。并將其顯示到頁面中。
在這樣一個(gè)jsp頁面中,${name}這個(gè)變量,是通過controller類中以返回modealAndView的方式,在modelAndView對象:modelAndView.addObject("name",?"SpringMVC");
那么在jsp頁面中,將會(huì)讀取這個(gè)KV,將name顯示為成“SpringMVC”。這樣就完成了一個(gè)從后臺(tái)向前臺(tái)的傳輸?shù)倪^程。
響應(yīng)過程
1 用戶在瀏覽器窗口輸入一個(gè)URL地址,以localhost:8080/ssm/為例子,由于這個(gè)URL是直接localhost/ssm/后面并沒有接更多的信息,就會(huì)直接顯示在web.xml中設(shè)定的welcome頁面index.html。 這個(gè)過程發(fā)生在View層。
2 于是在瀏覽器頁面上就會(huì)顯示index.html的內(nèi)容。用戶按下顯示onclick test的按鈕,通過javascript的ajax發(fā)送一個(gè)包含一個(gè)字符串“showUser.do”和一個(gè)KV對“id = 1”的一個(gè)請求到controller,controller再根據(jù)請求中的“showUser.do”調(diào)用對應(yīng)的controller方法。 這個(gè)過程從View層到Controller層。
3 請求來到Cotroller,通過掃描在Spring-MVC.xml中配置的目錄下的所有的Java類。找到這個(gè)目錄下所有帶有@Controller的類。在這些類中尋找“showUser.do”對應(yīng)的方法。在Controller類的第24行找到了一個(gè)selectUser方法。那么就會(huì)執(zhí)行這個(gè)方法,對來自View層的請求進(jìn)行響應(yīng)。這個(gè)過程發(fā)生在Controller層。
4 找到這個(gè)方法了,開始執(zhí)行。這個(gè)方法的核心在于,使用了userService這個(gè)對象以及它的的方法。關(guān)于如何使用的,在2.3.3中有詳細(xì)的解釋。在在這個(gè)類中,使用這個(gè)對象以及它的seclectUser方法,就是工作從Controller層到Model層的轉(zhuǎn)移。
5 來到Model層,映入眼簾的就是Service接口的實(shí)現(xiàn)類ServiceImple。我們不關(guān)注Service接口,經(jīng)過我的測試,去掉這個(gè)接口對程序的運(yùn)行也沒有影響。但是這個(gè)接口的存在,可以使Service方法更加規(guī)范化。在大型工程中,有一個(gè)這樣的接口可以更加規(guī)范。在這個(gè)ServiceImple類中,申明了一個(gè)UserDAO的對象,這個(gè)對象并沒有實(shí)體。通過注解,將UserDAO.xml作為這個(gè)接口的實(shí)體,使用定義在UserDAO.xml中的sql語句操作數(shù)據(jù)庫。
sql語句和UserDAO的對應(yīng),通過在spring-mybatis.xml中,將mapper的目錄和DAO接口的目錄配置進(jìn)去。這樣在mapper的xml中,聲明是對哪一個(gè)DAO接口的實(shí)現(xiàn),并且在每一個(gè)sql方法的標(biāo)簽內(nèi),設(shè)置id為對應(yīng)的DAO接口中的方法名,就可以視作將DAO的方法在mapper的xml中實(shí)現(xiàn)了。
通過目錄、接口名、方法名的一系列配置,在調(diào)用UserDAO接口的方法的時(shí)候,就可以直接使用對應(yīng)的sql語句。以:Useruser=this.userService.selectUser(userId);
然后在UserServiceImple中,調(diào)用UserDAO的方法:this.userDAO.selectUser(UserID);
在通過DAO的配置,使用UserDAO.xml中的sql語句操作數(shù)據(jù)庫。
這個(gè)部分的操作都是在Model層。但是將Model層分為兩個(gè)模塊:service和DAO的話,那么這個(gè)部分是在Model層中是從service到DAO的轉(zhuǎn)移。
6 我們忽略mapper的xml文件中具體執(zhí)行了什么。只考慮對數(shù)據(jù)庫操作之后有沒有數(shù)據(jù)的返回。
如果沒有,那么一個(gè)從前到后的SSM請求到響應(yīng)就已經(jīng)結(jié)束了。
大多數(shù)時(shí)候是有返回的。通過mapper的xml文件中的result設(shè)定的返回值類型,將從數(shù)據(jù)庫中獲取的數(shù)值,包裝成一個(gè)返回類型,返回給UserServiceImple的對象。
在這個(gè)例子中是從數(shù)據(jù)庫中獲取指定id處的,一個(gè)User對象的所有信息,將其包裝成一個(gè)User對象,返回給UserServiceImple。
這個(gè)部分的操作都是在Model層,細(xì)分的話那么這個(gè)部分是在Model層中是從DAO到service的轉(zhuǎn)移。
7 UserServiceImple對象將從DAO獲得了一個(gè)User對象的返回值,返回給Controller層。
這一個(gè)操作是從Model層返回到Controller層。
8 這樣的一個(gè)User對象從DAO、Service傳遞了Controller層中由“showUser.do”對應(yīng)的那個(gè)方法中繼續(xù)著下一步的操作。
通過下面兩行語句,將獲取的User對象轉(zhuǎn)換成一個(gè)字符串,然后傳送到j(luò)avascript代碼中請求所對應(yīng)的響應(yīng)碼responseText中。ObjectMappermapper=newObjectMapper();
response.getWriter().write(mapper.writeValueAsString(user);
然后通過DOM操作,將html中的某個(gè)字段修改成User對象的字符串形式。完成了獲取內(nèi)容在頁面上的顯示。這一步是從Controller層到View層的傳遞。
總結(jié)
以上是生活随笔為你收集整理的java mvc建包结构_Java SSM框架的配置方法、MVC结构的分析、响应的流程的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java模型给泛型_【一天一个基础系列】
- 下一篇: domino流程图_OA实施工程师一线解