SpringMVC框架介绍




Spring框架提供了构造Web应用程序的全能MVC模块。Spring MVC分离了控制器、模型对象、分派器以及处理程序对象的角色,这种分离让它们更容易进行制定。是一个标准的MVC框架。

那你猜一猜哪一部分应该是哪一部分?



SpringMVC框架图





spring mvc 整合 sqlite spring mvc例子_java

SpringMVC接口解释



DispatcherServlet接口:

Spring提供的前端控制器,所有的请求都有经过它来统一分发。在DispatcherServlet将请求分发给Spring Controller之前,需要借助于Spring提供的HandlerMapping定位到具体的Controller。

HandlerMapping接口:

能够完成客户请求到Controller映射。

Controller接口:

需要为并发用户处理上述请求,因此实现Controller接口时,必须保证线程安全并且可重用。Controller将处理用户请求,这和Struts Action扮演的角色是一致的。一旦Controller处理完用户请求,则返回ModelAndView对象给DispatcherServlet前端控制器,ModelAndView中包含了模型(Model)和视图(View)。从宏观角度考虑,DispatcherServlet是整个Web应用的控制器;从微观考虑,Controller是单个Http请求处理过程中的控制器,而ModelAndView是Http请求过程中返回的模型(Model)和视图(View)。

ViewResolver接口:

Spring提供的视图解析器(ViewResolver)在Web应用中查找View对象,从而将相应结果渲染给客户。

SpringMVC运行原理



1.客户端请求提交到DispatcherServlet

2.由DispatcherServlet控制器查询一个或多个HandlerMapping,找到处理请求的Controller

3.DispatcherServlet将请求提交到Controller

4.Controller调用业务逻辑处理后,返回ModelAndView

5.DispatcherServlet查询一个或多个ViewResoler视图解析器,找到ModelAndView指定的视图

6.视图负责将结果显示到客户端

SpringMVC运行实例

Account类:


[java] view plain copy



1. packagecom.pb.entity;
2. 
3. publicclassAccount{
4. privateStringcardNo;
5. privateStringpassword;
6. privatefloatbalance;
7. publicStringgetCardNo(){
8. returncardNo;
9. }
10. publicvoidsetCardNo(StringcardNo){
11. this.cardNo=cardNo;
12. }
13. publicStringgetPassword(){
14. returnpassword;
15. }
16. publicvoidsetPassword(Stringpassword){
17. this.password=password;
18. }
19. publicfloatgetBalance(){
20. returnbalance;
21. }
22. publicvoidsetBalance(floatbalance){
23. this.balance=balance;
24. }
25. 
26. }


继承AbstractController类或者实现Controller接口都可以


[java] view plain copy


1. packagecom.pb.web.controller;
2. 
3. importjava.util.HashMap;
4. importjava.util.Map;
5. 
6. importjavax.servlet.http.HttpServletRequest;
7. importjavax.servlet.http.HttpServletResponse;
8. 
9. importorg.springframework.web.servlet.ModelAndView;
10. importorg.springframework.web.servlet.mvc.AbstractController;
11. 
12. importcom.pb.entity.Account;
13. 
14. publicclassLoginControllerextendsAbstractController{
15. privateStringsuccessView;
16. privateStringfailView;//这两个参数是返回值传给applicationContext.xml,进行页面分配
17. 
18. publicStringgetSuccessView(){
19. returnsuccessView;
20. }
21. publicvoidsetSuccessView(StringsuccessView){
22. this.successView=successView;
23. }
24. publicStringgetFailView(){
25. returnfailView;
26. }
27. publicvoidsetFailView(StringfailView){
28. this.failView=failView;
29. }
30. @Override
31. protectedModelAndViewhandleRequestInternal(HttpServletRequestrequest,
32. HttpServletResponseresponse)throwsException{
33. //TODOAuto-generatedmethodstub
34. StringcardNo=request.getParameter("cardNo");
35. Stringpassword=request.getParameter("password");
36. Accountaccount=getAccount(cardNo,password);
37. Map<String,Object>model=newHashMap<String,Object>();
38. if(account!=null){
39. model.put("account",account);
40. returnnewModelAndView(getSuccessView(),model);
41. }else{
42. model.put("error","卡号和密码不正确");
43. returnnewModelAndView(getFailView(),model);
44. }
45. }//本应该这个方法写在模型层,这地方直接给放在了逻辑层这个地方偷懒了。
46. publicAccountgetAccount(StringcardNo,Stringpassword){
47. if(cardNo.equals("123")&&password.equals("123")){
48. Accountaccount=newAccount();
49. account.setCardNo(cardNo);
50. account.setBalance(88.8f);
51. returnaccount;
52. }else{
53. returnnull;
54. }
55. }
56. 
57. }


applicationContext.xml


[html] view plain copy


1. <?xmlversion="1.0"encoding="UTF-8"?>
2. 
3. <beansxmlns="http://www.springframework.org/schema/beans"
4. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
5. xmlns:aop="http://www.springframework.org/schema/aop"
6. xmlns:tx="http://www.springframework.org/schema/tx"
7. xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-2.0.xsd
8. http://www.springframework.org/schema/aophttp://www.springframework.org/schema/aop/spring-aop-2.0.xsd
9. http://www.springframework.org/schema/txhttp://www.springframework.org/schema/tx/spring-tx-2.0.xsd">
10. <beanid="loginController"class="com.pb.web.controller.LoginController">
11. <propertyname="successView"value="showAccount"></property>
12. <propertyname="failView"value="login"></property>
13. </bean>
14. <beanid="urlMapping"class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
15. <propertyname="mappings">
16. <props>
17. <propkey="/login.do">loginController</prop>
18. </props>
19. </property>
20. </bean>
21. <beanid="viewResolver"class="org.springframework.web.servlet.view.InternalResourceViewResolver">
22. <propertyname="prefix"value="/"></property>
23. <propertyname="suffix"value=".jsp"></property>
24. </bean>
25. </beans>

注:以下

<bean id="loginController" class="org.hzy.actions.LoginController">  
		<property name="successView" value="showAccount"></property>  
<!--         <property name="successView" value="/showAccount.jsp"></property>   -->
        <property name="failView" value="login"></property>  
    </bean> 
        <!--配置视图-->  
    <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">  
<!--       	<property name="viewClass"> -->
<!--              <value>org.springframework.web.servlet.view.InternalResourceView</value> -->
<!--          </property> -->
	<!-- 当这里配置了这个类时,上面的loginController中只需配置名字要是showAccount.jsp,而不是配置showAccount -->
    		<property name="prefix" value="/"></property>
        	<property name="suffix" value=".jsp"></property>
        	<!-- 当这里配置了prefix和suffix时,上面的loginController中配置名字则是(showAccount),而不是配置showAccount.jsp -->
    </bean>



Jsp页面:


[html] view plain copy


1. <%@pagelanguage="java"contentType="text/html;charset=GB18030"
2. pageEncoding="GB18030"%>
3. <!DOCTYPEhtmlPUBLIC"-//W3C//DTDHTML4.01Transitional//EN""http://www.w3.org/TR/html4/loose.dtd">
4. <html>
5. <head>
6. <metahttp-equiv="Content-Type"content="text/html;charset=GB18030">
7. <title>Inserttitlehere</title>
8. </head>
9. <body>
10. <ahref="login.jsp">进入</a>
11. 
12. </body>
13. </html>

login.jsp


[html] view plain copy


1. <%@pagelanguage="java"contentType="text/html;charset=GB18030"
2. pageEncoding="GB18030"%>
3. <!DOCTYPEhtmlPUBLIC"-//W3C//DTDHTML4.01Transitional//EN""http://www.w3.org/TR/html4/loose.dtd">
4. <html>
5. <head>
6. <metahttp-equiv="Content-Type"content="text/html;charset=GB18030">
7. <title>Inserttitlehere</title>
8. </head>
9. <body>
10. ${error}
11. <formaction="login.do"method="post">
12. 账号登陆<br>
13. <hr>
14. 卡号:<inputtype="text"name="cardNo"><br>
15. 密码:<inputtype="text"name="password"><br>
16. <inputtype="submit"value="登陆">
17. </form>
18. 
19. </body>
20. </html>

showAccount.jsp


[html] view plain copy



    1. <%@pagelanguage="java"contentType="text/html;charset=GB18030"
    2. pageEncoding="GB18030"%>
    3. <!DOCTYPEhtmlPUBLIC"-//W3C//DTDHTML4.01Transitional//EN""http://www.w3.org/TR/html4/loose.dtd">
    4. <html>
    5. <head>
    6. <metahttp-equiv="Content-Type"content="text/html;charset=GB18030">
    7. <title>Inserttitlehere</title>
    8. </head>
    9. <body>
    10. 账户信息<br>
    11. 卡号:${account.cardNo}<br>
    12. 密码:${account.password}<br>
    13. 钱数:${account.balance}<br>
    14. </body>
    15. </html>


    Web.xml


    [html] view plain copy


    1. <?xmlversion="1.0"encoding="UTF-8"?>
    2. <web-appxmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    3. xmlns="http://java.sun.com/xml/ns/j2ee"
    4. xmlns:javaee="http://java.sun.com/xml/ns/javaee"
    5. xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"xsi:schemaLocation="http://java.sun.com/xml/ns/j2eehttp://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"version="2.4">
    6. <welcome-file-list>
    7. <welcome-file>index.jsp</welcome-file>
    8. </welcome-file-list>
    9. <servlet>
    10. <servlet-name>Dispatcher</servlet-name>
    11. <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    12. <init-param>
    13. <param-name>contextConfigLocation</param-name>
    14. <param-value>classpath:applicationContext.xml</param-value>
    15. </init-param>
    16. </servlet>
    17. <servlet-mapping>
    18. <servlet-name>Dispatcher</servlet-name>
    19. <url-pattern>*.do</url-pattern>
    20. </servlet-mapping>
    21. </web-app>


    上面中servlet中不给参数的话自动查找的xml名称格式是<servlet-name>-servlet.xml,例如:dispatcherServlet-servlet.xml,给定<init-param>指定applicationContext.xml




    也可以加上:

    1. <context-param>
    2. <param-name>contextConfigLocation</param-name>
    3. <param-value>
    4. classpath:applicationContext.xml
    5. </param-value>
    6. </context-param>
    7. <listener>
    8. <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    9. </listener>


    工程原码:原码

    SpringMVC总结