1. 程式人生 > >SpringMvc初入門(帶完整入門專案)

SpringMvc初入門(帶完整入門專案)

最近閒暇之餘,感覺很久沒有寫部落格了, 以前都是寫一些演算法, 今天打算寫一下SpringMvc.   總的來說Mvc也算是一種設計模式,  不僅僅是Java, 前端js, 資料庫。 也可以採用這種模式來達到一個業務邏輯和頁面顯示通過控制器達到解耦的目的。 SpringMvc可以跟SpringIOC無縫對接, 比起struts2也有好的幾點如下:

    第一:struts2 效能較低, 基本上在我的機子上跑速度比較慢, 主要我想是他自帶的標籤庫,UI庫。 在前端如此豐富的今天完全沒有必要用struts2自帶的標籤庫了。

   第二: SpringMvc是基於方法級切入的,struts是基於類切入的。相對於而言,Spring粒度更細。

   第三:struts2的入口是filter, 而Springmvc是servlet.

   第四:Spring所提供SpringSecurity這個許可權框架也很不錯。 當然我並沒有在struts2上做過多個深入, 估計也有這種框架。

首先我假定你已經對Spring這個框架有一定的瞭解,但是沒有也沒關係。

首先我們介紹的是SpringMvc的核心。 DispatcherServlet, 這個Servlet充當SpringMvc的前端控制器主要用作職責排程工作 ,也就是一個流程的控制。他得在web.xml中進行配置。

<servlet>  
        <servlet-name>xxx</servlet-name>  
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
<load-on-startup>1<load-on-startup> 
<servlet>

其中servlet-name 這個屬性蠻重要,在預設的情況下,DispatcherServlet會載入從一個基於這個Servlet名字的xml檔案中

載入Spring應用的上下文。  比如上面的例子, DispatcherServlet會載入xxx-servlet這個檔案,這個xml檔案一般是寫在你的

Tomcat的WEB-INF目錄下面。


接著我們必須宣告DispatcherServlet要處理的URL(*,htm /* /app)等等, 這個也是寫在你的web,xml中的, 如:

 <servlet-mapping>  
        <servlet-name>zd_web</servlet-name>  
        <url-pattern>/</url-pattern>  
    </servlet-mapping>  
 url-pattern 就是你要處理的URL, 我這裡加上 "/" 意思是處理所有的URL。 (你也可以在Spring中配置<mvc:resources>這個元素)

接著我們可以指定DispatcherServlet將請求傳送給哪個控制器。   所有的請求都要通過DispatcherServlet,然後再由它進行分發, 一般我們將請求傳送到HanderMapping上面,那什麼是HanderMapping呢,HanderMapping的就是為每個請求找到合適的處理器handler. 那什麼是handler呢, 通俗點講就是標註了@RequestMapping的方法。

 那麼我們怎麼確定控制器呢, 在通俗點講就是在類上面標註@Controller註解進行裝飾的class。  這個我在網路上找了一張圖:

首先,當前端的請求到達的時候, 我們根據我們所編寫的請求類進行處理, 這個類必須打上@controller這個註解,以表示它是一個控制器類, 接著我們可以在這個類的方法

裡面打上@RequestMapping對請求進行裝飾。

   好的,首先我們先不管那麼多概念, 心中得有一個流程的模型, 俗話說,程式碼能跑起來在想優化的事情。   那麼知道這幾個概念後,我們可以開始跑一跑這個小專案了,

首先定義一個表單類, 他用javaScript進行GET方式的提交:

             我們把這個jsp頁面的名字叫做logins.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"  
    pageEncoding="UTF-8"%>  
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">  
<html>  
<head>  
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">  
<title>Add User</title>  
  
  
<script type="text/javascript">  
    //新增使用者  
    function addUser() {  
        var form = document.forms[0];  
        form.action = "${pageContext.request.contextPath}/logins";  
        
        form.method = "get";  
        form.submit();  
    }  
</script>  
  
</head>  
<body>  
    <form>  
        <table>  
            <tr>  
                <td>賬號</td>  
                <td>  
                    <input type="text" name="userName">  
                </td>  
            </tr>  
            <tr>  
                <td>密碼</td>  
                <td>  
                    <input type="password" name="password">  
                </td>  
            </tr>  
            <tr>  
                <td> </td>  
                <td>  
                    <input type="button" value="提交" onclick="addUser()">  
                </td>  
            </tr>  
        </table>  
    </form>  
</body>  
</html>

接著我們在寫控制器 定義一個包名字為login, 因為我上面通過JS的from.submit()提交了表單。 這個控制器類的名字叫LoginContller
package login;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

@Controller
public class LoginController {

	
	@RequestMapping(path="/logins",method=RequestMethod.GET)
	public String login(LoginBean loginBean) {
		 System.out.println(loginBean.getuserName());
		 System.out.println(loginBean.getPassword());
		 
		 return "logins";
	}
	 
}
其中path 是URI名稱, 也就是你輸入地址 http://locathost:"加上你的專案名"/logins/

接著我們在寫一個Bean,接受請求的引數,UserName和PassWrod,他的名字是loginBean

package login;

import javax.validation.constraints.Size;

import org.hibernate.validator.constraints.Length;

public class LoginBean {

	
	  private  String userName;
	  
	  private  String Password;
	  

	public String getuserName() {
		return userName;
	}

	public void setuserName(@Size(min=4,max=15,message="賬號要滿足4-15個字元")String userName) {
		this.userName = userName;
	}

	public String getPassword() {
		return Password;
	}

	public void setPassword(@Length(min=6,max=15,message="密碼要滿足6-15個字元")String password) {
		Password = password;
	}
	  
	  

}
其中Size和Length是JSR的資料效驗,這個大家可以忽略或者去掉。

接著web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">

<display-name>zd_web</display-name>
  <welcome-file-list>
    <welcome-file>login.jsp</welcome-file>
    <welcome-file>login.jsp</welcome-file>
    <welcome-file>login.jsp</welcome-file>
    <welcome-file>login.jsp</welcome-file>
    <welcome-file>login.jsp</welcome-file>
    <welcome-file>login.jsp</welcome-file>
  </welcome-file-list>
  
   <!--  
    	<listener>  
            <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>  
        </listener>  
  -->
      <servlet>  
        <servlet-name>zd_web</servlet-name>  
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>  
        
     <init-param>
          <param-name>contextConfigLocation</param-name>
        <param-value>WEB-INF/zd_web-servlet.xml</param-value> 
      </init-param>  
    <load-on-startup>1</load-on-startup> 
        
        
    </servlet> 
	
    
    <servlet-mapping>  
        <servlet-name>zd_web</servlet-name>  
        <url-pattern>/</url-pattern>  
    </servlet-mapping>  


</web-app>

其中zd_web是我在寫的一個Erp名字叫zd_web 這個大家可以換做你自己的專案名。或者也寫成這樣。(需要註釋掉listener如果知道IOC的應該想得到,沒學的可以直接註釋)

 接著是Spring的配置檔案, 名字為:zd_web-servlet(同上zd_web名字可以改成你的專案名):

context:component-scan base-package="login"/>
<!-- <context:component-scan base-package="login_Verify_picture"/> -->
 
    <!-- 啟用spring mvc 註解 -->
    <context:annotation-config />

   <mvc:default-servlet-handler /> 
 
  <!-- 完成請求和POJO對映 -->
    <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter" />

    <mvc:annotation-driven />
    
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"
            id="internalResourceViewResolver">
        <!-- 字首 -->
        <property name="prefix" value="/WEB-INF/jsp/" />
        <!-- 字尾 -->
        <property name="suffix" value=".jsp" />
    </bean>

其中 org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdaper 就是我們的檢視控制器了, 他通過
<property name="prefix" value=
提供你具體的返回檢視, 在哪裡返回呢? 看上面的打上了@Controller的類中打上了@RequestMapping的那個方法, 他的return, 他return的就是具體的檢視, 我們通過

在配置檔案中配置檢視的位置, 字首比如說這個檢視在WEB-INF目錄下的jsp目錄下, 字尾就是他以.jsp頁面結尾的字尾。 當然檢視還有多種方法, 這裡我給出的是最簡單暴力的方法。 

 那麼整個入門專案貌似就完成了,下面我給出在我機子上面的執行截圖:



最近很忙,所以寫的很不好, 望各位多加指正, 關於Spring的其他(對REST的支援,許可權框架, 事務管理, IOC容器)。 我會等有空後跟大家分享。對於書籍,

Spring in action 和Spring3.0x企業實戰 這2本書我覺得很好呢。 嘿嘿