1. 程式人生 > >建立SpringMVC專案(註解式)

建立SpringMVC專案(註解式)

註解式的springmvc專案

註解式的springmvc:就是使用註解@Controller,建立處理器物件。

1.新建 web 專案
2.匯入jar包:
1)spring的核心jar:spring-beans.jar,spring-core.jar,spring-context.jar,spring-exression.jar
2)spring-aop.jar
3)spring-web.jar
4)springmvc框架(模組):spring-webmvc.jar
5)日誌:commons-logging.jar, log4j.jar
3.重點:修改web.xml
1)註冊springmvc中核心物件 DispatcherServlet(中央排程器), 它的父類是繼承HttpServlet.
DispatcherServlet是一個Servlet. 用Servlet的方式使用它。

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
  <display-name>test-springmvc</display-name>
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
 <!-- 
       註冊中央排程器(DispatherServlet)
	       DispatcherServlet在被建立後,會呼叫Servlet的init()方法,在方法中會建立springmvc的容器物件DispatcherServlet在被建立後,會呼叫Servlet的init()方法,在方法中會建立springmvc的容器物件
       建立容器(WebApplicationContext)物件時,會載入配置檔案,配置檔案的預設路徑是/WEB-INF/<servlet-name>-servlet.xml  
       如: /WEB-INF/myweb-servlet.xml
	     /WEB-INF/springmvc-servlet.xml/WEB-INF/springmvc-servlet.xml
      
   -->
   <servlet>
   	<servlet-name>springmvc</servlet-name>
    <!-- 
       Servlet物件建立的時候,會呼叫初始方法 init()
     -->
   	<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
   	
   	<!-- 
   	    指定自定義的配置檔案 springmvc.xml就是自定義的配置檔名
   	 -->
   	 <init-param>
   	 	<param-name>contextConfigLocation</param-name>
   	 	<param-value>classpath:springmvc.xml</param-value>
   	 </init-param>
   	<!-- 
   	       在伺服器(tomcat)啟動的時候,建立物件的。 load-on-startup標籤的值是 大於等於 0的整數
   	   數值越小,伺服器建立物件的時間越早。 
   	 -->
   	<load-on-startup>1</load-on-startup>
   </servlet>
   
   <servlet-mapping>
   	<servlet-name>springmvc</servlet-name>
   	<!-- 
   	   配置<url-pattern>,目的是把請求的交給中央排程器物件, 只有把請求交給中央排程器,才是經過springmvc框架處理
   	   中央排程器是springmvc框架的入口,門戶。
   	
   	   <url-pattern>在框架中的使用,主要有兩種方式
   	   1.副檔名: *.xxxx , xxx就是自定義的副檔名, 例如*.do, *.action, *.mvc等等,不能使用(*.jsp)
   	     http://localhost:8080/myweb/some.do
   	     http://localhost:8080/myweb/user/listUser.do
   	   2.斜槓"/"
   	 -->
   	<url-pattern>*.do</url-pattern>
   </servlet-mapping>
  </web-app>

2)DispatcherServlet(中央排程器)作用:接收使用者的請求, 把處理結果顯示給使用者。
DispatcherServlet可以看做是springmvc專案的入口。
3)DispatcherServlet也叫做前端控制器(front controller)
4.新建jsp,發起一個請求。
5.新建處理器類,普通的java類
1)在類的上面加入@Controller, 表示建立處理器類的物件
2)在類中定義方法, 在方法的上面加入@RequestMapping()

6.新建jsp,顯示請求的處理結果。
7.定義sringmvc的配置檔案(等同spring的配置檔案)
1)宣告元件掃描器,指定@Controller註解所在的包名

<?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: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.xsd">
<!-- 宣告處理器物件, 讓他處理某個請求 
	     class:處理器類的全限定名稱
	     id:物件的名稱, 物件的名稱表示請求的uri地址。
	        要求以“/”開頭,springmvc根據“/”判斷當前的物件能否處理請求。
	        “/”是用來區別處理器物件和其他普通物件的。        
	
	-->
<context:component-scan base-package="com.zm.controllers"/>
    <!-- 靜態資源 -->
    <mvc:default-servlet-handler/>
    
    <!-- 註解驅動 -->
    <mvc:annotation-driven/>
</beans>

2)宣告檢視解析器,處理檢視的建立

<!-- 
		宣告檢視解析器物件, 處理檢視的(指定檢視檔案的路徑和副檔名):
		中央排程器會呼叫檢視解析器處理檢視的 .                  
		實現ViewResolver介面的類,叫做檢視解析器。
	-->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    	<!-- 指定字首:檢視的目錄 -->
    	<property name="prefix" value="/WEB-INF/jsp/" />
    	<!-- 指定字尾:檢視的檔案的副檔名 -->
    	<property name="suffix" value=".jsp" />
    </bean>

8.修改處理器方法,使用邏輯檢視名稱。

/**
 * @Controller:建立處理器類的物件, 預設是單例物件
 *         位置:在類的上面
 *
 */
@Controller
@RequestMapping("test")  //模組名稱  如127.0.0.1:8080/myspringmvc/test/some.do
public class MyController {

	/**
	 * 定義方法, 處理請求。
	 * @RequestMapping: 請求對映。
	 *          作用:把請求對映到某個方法, 由這個方法處理請求。把請求繫結到方法。
	 *          屬性:1.value,表示請求的uri地址(資源名稱), uri的值是唯一的。不能重複。
	 *                 uri可以用“/”開頭, “/”開頭表示絕對路徑,從web專案的根目錄開始
	 *                 也可以不加“/”,相對地址
	 *                 
	 *          位置:  1.在方法的上面
	 *                2.在類的上面
	 *  
	 * 處理器方法:使用@RequestMapping修飾的方法。叫做處理器方法
	 */
	 
	 //value可以省略 如@RequestMapping("/some.do")
	 //method 只處理post請求 預設是get 不指定的話沒有限制
	@RequestMapping(value={"/some.do","/first.do"},method = RequestMethod.POST) 
	public ModelAndView doSome(){ //預設doGet   doSome()名字可以隨意定義
		ModelAndView mv = new ModelAndView();
		//呼叫Service,處理請求, 把結果輸出給瀏覽器
		mv.addObject("msg", "SpringMVC Annotation");
		mv.addObject("fun", "doSome");
		
		//指定檢視
		mv.setViewName("show");
		
		return mv;
		
	}
	
	//指定some.do中必須有name ,age兩個引數, 可以有其他引數
	@RequestMapping(value="some.do",params={"name","age"})
	
	//other.do必須有age ,不能有name ,可以有其他引數
	@RequestMapping(value="other.do",params={"!name","age"})
	
	//first.do必有name ,age ,同時name的值必須是zs, age的值必須是23;可以有其他引數
	@RequestMapping(value = "first.do",params={"name=zs","age=23"})

	//可以定義多個處理器方法
	//@RequestMapping(value={"other.do","second.do"})
	public ModelAndView doOther(){ //doGet
		ModelAndView mv = new ModelAndView();
		//呼叫Service,處理請求, 把結果輸出給瀏覽器
		mv.addObject("msg", "SpringMVC Annotation");
		mv.addObject("fun", "doOther");
		
		//指定檢視
		mv.setViewName("show");
		
		
		return mv;
		
	}
/**
	 * 逐個接收請求的引數:要求是請求中的引數名和處理器方法的形參名一樣,按名稱對應一一賦值
	 * 框架接收引數:
	 *  1.使用request.getParameter()接收引數
	 *   String strName = request.getParameter("name");
	 *   String strAge = request.getParameter("age");
	 *   
	 *  2. 當處理器的介面卡物件呼叫處理器方法doSome()的時候,按名稱給引數賦值
	 *    doSome(strName, Integer.parseInt(strAge))
	 *    框架提供了String到int , long ,float ,double的型別轉換。
	 */
	@RequestMapping(value="some.do")
	public ModelAndView doSome(Integer age,String name){ 
	//如果用int age的話,當沒有獲取到age引數時,型別轉換會報錯,如果用包裝類Integer會給他初始化為null
		ModelAndView mv = new ModelAndView();
		
		System.out.println("name:"+name+"|age:"+age);
		//呼叫Service,處理請求, 把結果輸出給瀏覽器
		mv.addObject("myname", name);
		mv.addObject("myage", age);
		
		//指定檢視
		mv.setViewName("show");
		return mv;
	}
}

index.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>Insert title here</title>
</head>
<body>
  index.jsp <br>
  <a href="some.do">發起請求some.do</a>
</body>
</html>

show.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>Insert title here</title>
</head>
<body>
  /WEB-INF/jsp/show.jsp,使用了檢視解析器<br>
  msg: ${msg }
</body>
</html>

other.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>Insert title here</title>
</head>
<body>
  /WEB-INF/jsp/other.jsp<br>
  msg: ${msg }
</body>
</html>