1. 程式人生 > >springMVC基礎知識小結

springMVC基礎知識小結

路徑 如何 aop path 區別 ESS encoding 解析 無法找到

SpringMVC學習筆記
第一講 簡單使用SpringMVC框架
    通過springMVC做一個簡單的登錄功能,從而簡單了解一下SpringMVC的運行流程:
    1.導入相應的jar包
	  spring-webmvc.jar包
	2.SpringMVC配置文件springmvc.xml文件:
	  <?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:aop="http://www.springframework.org/schema/aop"  
            xmlns:tx="http://www.springframework.org/schema/tx"  
            xmlns:context="http://www.springframework.org/schema/context"  
            xsi:schemaLocation="  
                http://www.springframework.org/schema/beans 
                http://www.springframework.org/schema/beans/spring-beans-3.0.xsd  
                http://www.springframework.org/schema/aop 
                http://www.springframework.org/schema/aop/spring-aop-3.0.xsd  
                http://www.springframework.org/schema/tx 
                http://www.springframework.org/schema/tx/spring-tx-3.0.xsd  
                http://www.springframework.org/schema/context 
                http://www.springframework.org/schema/context/spring-context-3.0.xsd">
            <!-- 掃描註解 -->
	        <context:component-scan base-package="com.xt.controller"></context:component-scan>
            <!-- 前後綴 -->
	        <bean
		       class="org.springframework.web.servlet.view.InternalResourceViewResolver">
		       <property name="prefix" value="/WEB-INF/views/"></property>
		       <property name="suffix" value=".jsp"></property>
	        </bean>
        </beans>
	3.在web.xml中,配置springmvc的入口,以及初始參數
	  <?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">
        <servlet>
		    <servlet-name>spring</servlet-name>
		    <!-- SpringMVC入口 -->
		    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
		    <init-param>
			    <param-name>contextConfigLocation</param-name>
			    <!-- spring配置文件所在的路徑 如果不配置需要將配置文件的名稱設置為spring-servlet.xml -->
			    <param-value>classpath:springmvc.xml</param-value>
		    </init-param>
		    <!-- 啟動加載 -->
		    <load-on-startup>1</load-on-startup>
	    </servlet>
	    <servlet-mapping>
		    <servlet-name>spring</servlet-name>
		    <url-pattern>/</url-pattern>
	    </servlet-mapping>
      </web-app>
	  
	4.login.jsp:
	    <form action="login/userLogin" method="post">
           <ul>
               <li>用戶名:<input type="text" name="userName"/></li>
               <li>密碼:<input type="password" name="pwd"></li>
               <li>
                    <input type="submit" name="登錄">
               </li>
           </ul>
        </form>
	5.LoginController.class文件:
	  @Controller
	  @RequestMapping("/userLogin")
	  public class LoginController{
	     @RequestMapping("/login")
	     public String login(String userName,String pwd){
		    Systom.out.println("用戶名:"+userName);
			Systom.out.println("密碼:"+pwd);
		    if(userName.equals("張三")&&pwd.equals("123"))
			    return "success";
			else
			    return "error";
		 }
	  }
	  
	解析:
	(1).因為在LoginController.class中,使用了註解,所以,在springmvc的配置文件中,我們需要
	    配置對註解的掃描範圍。因為LoginController.class在com.xt.controller包下,所以我們就掃描
	    該包下的所有註解。base-package就是要掃描的包。否則註解無效
	(2). 對於轉發,我們通常會在COntroller層中返回一個字符串,該字符串是即將跳轉的目標地址。不含
	     後綴名。所以,在配置文件中會配置前後綴。
		 <property name="prefix" value="/WEB-INF/views/"></property>代表目標文件所在的位置;
		 <property name="suffix" value=".jsp"></property>代表目標文件的文件類型
	(3).在web.xml文件的配置中,我們需要註意的是首先要配置springmvc的入口,其次是配置文件springmvc.xml
	    的位置路徑以及文件名稱。
	(4).對於普通的從頁面到controller層的參數傳遞,有多種方式。在這裏我們首先學習最基本的傳參方式。
	    也就是頁面的name屬性的值與controller層的方法中的形參名稱相同。還有多種傳參方式,在下一章中
		進行詳細解說。
	(5).僅僅到這裏,我們基本完成了從頁面傳參以及轉發的過程,可以進行簡單的開發了。但是需要註意的是,
	    我們發現,當頁面傳遞參數到controller層中時,發生了亂碼的現象。處理方法就是在web.xml中配置一個
		字符編碼的過濾器。即:
		<!-- 字符編碼過濾器 -->
	<filter>
		<filter-name>encodingFilter</filter-name>
		<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
		<init-param>
			<param-name>encoding</param-name>
			<param-value>UTF-8</param-value>
		</init-param>
		<init-param>
			<param-name>forceEncoding</param-name>
			<param-value>true</param-value>
		</init-param>
	</filter>
	<filter-mapping>
		<filter-name>encodingFilter</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>
	這樣就解決了傳參亂碼的現象。當然也可以不在web.xml中寫,可以創建一個filter類進行攔截。

第二講 springMVC的傳參方式
    在之前的講解中,我們使用了最簡單的傳參方式,就是讓頁面的name屬性與controller層中方法中的
	形參名稱相同。還有一種傳參的方式是由一名程序員在項目開發中實現的,叫做RestFul。這並不是
	一種新的編碼方式,而是一種風格。
    例如:
	@RequestMapping("/login/{userName}/{pwd}")
    public String login(@PathVariable String userName,@PathVariable String pwd){
	    .......
	}
	在login.jsp中:
	<a href="login/張三/123456">登錄</a>
	這樣也可以將參數傳到後臺。
	註意:
	在@RequestMapping("/login/{userName}/{pwd}")中,{}與{}之間是用什麽分隔符隔開,在前臺就要用
	相同的分隔符隔開,否則會找不到請求路徑。
	例如:
	@RequestMapping("/login/{userName}_{pwd}")
	那麽在前臺中:
	<a href="login/張三_123456">登錄</a>
	
	在剛才的例子中,我們使用到了註解@PathVariable。否則參數無法傳遞到後臺,結果是null。細心的
	同學會發現,在剛才的例子中,@RequestMapping中的參數名稱與方法中的形參名稱相同,即:
	@RequestMapping("/login/{userName}/{pwd}")
    public String login(@PathVariable String userName,@PathVariable String pwd){
	    .......
	}
	如果不相同就會報錯:
	在請求路徑中無法找到方法中所需的參數。
	那麽,假如哪天我就是想讓它們不相同怎麽辦?
	例如:
	@RequestMapping("/login/{a}/{b}")
    public String login(@PathVariable String userName,@PathVariable String pwd){
	    .......
	}
	這樣肯定會報錯,那麽該怎麽處理呢?
	很簡單,就是在@PathVariable中指明參數:
	@RequestMapping("/login/{a}/{b}")
    public String login(@PathVariable("a") String userName,@PathVariable("b") String pwd){
	    .......
	}

第三講 SpringMVC的轉發與重定向以及靜態資源的放行
    1.轉發
	      在開發過程中,為了提升安全性,我們通常會將jsp頁面放在web-inf目錄下。因為在web-inf目錄下的文件是
	  不能直接訪問的。那麽我們該如何訪問這些文件呢?
	  (1).首先我們要在springMVC的配置文件中,配置視圖解析。也就是前後綴:
	        <!-- 前後綴 -->
	        <bean>
		       class="org.springframework.web.servlet.view.InternalResourceViewResolver">
		       <property name="prefix" value="/WEB-INF/views/"></property>
		       <property name="suffix" value=".jsp"></property>
	        </bean>
			prefix:前綴(路徑)
			suffix:後綴
	  (2).在controller中,在進行轉發的時候,直接返回一個字符串,該字符串就是即將要轉發到的文件的名稱。
	      例如:
		  @RequestMapping("/login")
	      public String login(String userName,String pwd){
		      System.out.println(userName);
		      System.out.println(pwd);
		      if(userName.equals("張三")&&pwd.equals("123456"))
			      return "success";
		      else
			      return "error";
	      }
		  return "success"就是轉發到success.jsp。
	  (3).使用ModelAndView進行轉發
	      官方為我們提供了一個類叫做ModelAndView,使用該類也可進行轉發與重定向。
		  例如:
		  @RequestMapping("/login")
		  public ModelAndView login(String userName,String pwd){
		        ModelAndView mv = null;
				if(2>1){
				   mv = new ModelAndView("success");
				   mv.add("userName",userName);
				   mv.add("pwd",pwd);
				}else{
				   mv = new ModelAndView("error");
				}
				return  mv;	
		  }
		  解析:
		  ModelAndView類為我們提供了有參構造方法,該構造方法的參數就是我們即將要轉發到的目標文件名稱。
		  add()方法能夠將要轉發所帶的的參數帶到目標位置。
	  
	2.重定向
      (1).在進行重定向的時候,可以使用redirect
	      例如:
		  @RequestMapping("/login")
	      public String login(String userName,String pwd){
		      System.out.println(userName);
		      System.out.println(pwd);
		      if(userName.equals("張三")&&pwd.equals("123456"))
			      return "redirect:/success.jsp";
		      else
			      return "redirect:/error.jsp";
	      }
		  註意:
		  在進行重定向 的時候,加"/"與不加"/"是有區別的:
		  (1).加"/"表示從根目錄進行查找
		  (2).不加"/"表示從本類開始查找
	
	(2).靜態資源的放行
        在開發過程中,我們會引入很多js或者css文件,那麽springMVC攔截器可能會將這些文件攔截,
        所以此時需要對這些文件進行放行。
        <!-- 靜態資源放行 -->
	    <servlet-mapping>
		    <servlet-name>default</servlet-name>
		    <url-pattern>*.js</url-pattern>
	    </servlet-mapping>
        <servlet-mapping>
		    <servlet-name>default</servlet-name>
		    <url-pattern>*.css</url-pattern>
	    </servlet-mapping>		
        		
	
	
	

  

springMVC基礎知識小結