程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> JAVA綜合教程 >> Spring MVC配置,springmvc配置

Spring MVC配置,springmvc配置

編輯:JAVA綜合教程

Spring MVC配置,springmvc配置


  今天剛學習了Spring MVC,這裡把Spring MVC配置流程記錄下來,方便以後查閱,本人菜鳥一枚,學藝不精,如果內容有錯誤或表述不當,歡迎各位大神指正

一、搭建環境
   1、導入jar包:Spring常用jar包以及spring-web-3.2.7.RELEASE、spring-webmvc-3.2.7.RELEASE
   2、修改web.xml文件,引入映射
     Spring MVC 是基於DispatcherServlet的MVC框架,每個請求最先訪問DispatcherServlet,所以先配置DispatcherServlet

<servlet>
      <servlet-name>hello</servlet-name>
      <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
      <!-- 可以自定義servlet。xml配置文件的位置和路徑,默認為在WEB-INF目錄下,名稱為hello-servlet.xml -->
      <load-on-startup>1</load-on-startup>
      <!-- 優先級 
          當值為0或者大於0時,表示容器在應用啟動時就加載並初始化這個servlet
        當值小於0或者沒有指定時,則表示容器在該servlet被選擇時才會去加載
        正數的值越小,該servlet的優先級越高,應用啟動時就越先加載
        當值相同時,容器就會自己選擇順序來加載
      -->
  </servlet>
  <servlet-mapping>
      <servlet-name>hello</servlet-name>
      <url-pattern>/</url-pattern>
      <!-- 注意:不能掃描/*,會導致.jsp等文件無法導入
        可以使用*.do或/,官方推薦使用/,但使用/,會使圖片無法顯示 -->
  </servlet-mapping>

   3、在WEB-INF 目錄下創建一個與<servlet-name>同名的hello-servlet.xml文件,

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:mvc="http://www.springframework.org/schema/mvc"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:context="http://www.springframework.org/schema/context"
    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">
    
    <mvc:annotation-driven/>
    <!-- 啟用annotation注解,
        也可以不使用annotation,但必須注明 Controller 所在的路徑,及request請求後綴名,一般不使用
        <bean name="/hello" class="com.sram.controller.HelloController"></bean>
     -->
     <!-- 使用注解的類所在的包 -->
    <context:component-scan base-package="com.xx.controller"/>
    
    <!-- 完成請求和注解的映射 -->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <!-- 對轉向頁面的路徑解析, prefix:前綴;suffix:後綴  -->
    <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
       <!-- /WEB-INF/jsp/xx.jsp -->
    <property name="prefix" value="/WEB-INF/jsp/"/>
    <property name="suffix" value=".jsp"/>
</bean>
</beans>
hello-servlet.xml文件

    由於/會攔截靜態資源,在servlet.xml文件中添加配置:<mvc:resources location="/resources/" mapping="/resources/**"/>

可以解決這個問題(推薦使用),可以包括圖片、css文件、js文件或引入其他資源,將這些資源文件存放在WebRoot目錄下的resources文件夾下

    DispatcherServlet會利用特殊bean處理request請求和生成相應的視圖返回

    視圖返回類型是由視圖解析器控制的,jsp中常用的視圖解析器是InternalResourceViewResolver,如上,通過前綴和後綴拼接成jsp路徑:/WEB-INF/jsp/hello.jsp

  4、Controller

    使用@Controller標記的都是Controller類

package com.sram.controller;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.AbstractController;

public class HelloController extends AbstractController{
    @Override
    protected ModelAndView handleRequestInternal(HttpServletRequest request,
            HttpServletResponse response) throws Exception {
        System.out.println("hello Spring-mvc!!!");
        return new ModelAndView("hello");
    }
}
通過Bean關聯到Controller類
package com.sram.controller;


import javax.servlet.http.HttpServletRequest;

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

@Controller
@RequestMapping("/hello")
public class HelloController {
    //requesetMapping:請求映射,用來申明當前被指定的方法或類使用什麼URL可以進行訪問
    @RequestMapping("/test")
    protected ModelAndView test() throws Exception {
        System.out.println("hello Spring-mvc!!!");
        return new ModelAndView("hello");
    }
    //value表示當前的url地址,method表示當前請求的請求方式(get、post、delete...)
    @RequestMapping(value="/xiake",method=RequestMethod.GET)
    protected ModelAndView xiake() throws Exception {
        System.out.println("無參的");
        return new ModelAndView("hello");
    }
    @RequestMapping(value="/xiake",method=RequestMethod.POST)
    protected ModelAndView xiake(HttpServletRequest request) throws Exception {
        System.out.println("有參的");
        return new ModelAndView("hello");
    }
}
通過annotation關聯到Controller類 不同方法傳值(Model2View)

 

package com.sram.controller;

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

@Controller
@RequestMapping("/test")
public class TestController {
    @RequestMapping//無參:默認執行該方法
    public String test1(){
        System.out.println("無參默認執行");
        return "test";
    }
    @RequestMapping("/test2")
    public String test2(){
        return "test";
    }
    //value屬性可以跟一個String類型的數組,數組中所有的字符串(URL)都可以被映射到當前方法
    @RequestMapping(value={"/test3_1", "test3_2"})
    public String test3(){
        System.out.println("url數組");
        return "test";
    }
    //下面的用法可以匹配正常URL之後跟一個/,/之後也可以在增加其他任意字符
    //*表示/後的任意字符,但只能到下一級
    @RequestMapping("/teset4/*")
    public String teset4(){
        System.out.println("xx/*--下一級路徑任意值");
        return "test";
    }
    //任意以/test5開頭的請求都可以被匹配
    //**表示test5之後的任意字符
    //*表示出現0次或多次
    @RequestMapping("/test5/**")
    public String addUser4(){
        System.out.println("/xx/**--以/xx開頭的任意請求");
        return "test";
    }
    //?表示URL之後長度為1,可以用來控制長度         /?:/之後一位字符     /??:/之後兩位字符
    @RequestMapping("/test6/?")
    public String test6(){
        System.out.println("?控制長度");
        return "test";
    }
}
url2Controller
package com.sram.controller;

import java.util.ArrayList;
import java.util.Arrays;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;

import com.sram.beans.User;

@Controller
@RequestMapping("/test")
public class TestController {
    @RequestMapping("/test0")
    public String test0(String str){
        System.out.println(str);
        return "test";
    }
    //此處參數的名字必須與頁面中的name屬性值相同
    @RequestMapping("/test1")
    public String test1(int id, String userName,String password, String nickName){
        User u = new User(id, userName, password, nickName);
        System.out.println(u);
        return "test";
    }
    //參數可以直接寫頁面傳值對應的對象,spring mvc 會自動將頁面的參數傳入到指定的對象中,
    //若有級聯對象,則需要以級聯對象,屬性這樣的形式來進行傳值(group.id)
    @RequestMapping("/test2")
    public String test2(User u){
        System.out.println(u);
        return "test";
    }
    //從頁面傳遞的數組,在spring mvc 中只能以數組的形式進行傳值,不能用集合
    @RequestMapping("/test3")
    public String test3(String[] intr){
        System.out.println(Arrays.toString(intr));
        return "test";
    }
    /*@RequestMapping(value="/test3")
    public String test3(ArrayList<String> intr){
        System.out.println(intr);
        return "test";
    }*/
    @RequestMapping("/test4")
    public String test4(@RequestParam(required=false, value="abc", defaultValue="hello") String str){
        System.out.println(str);
        return "test";
    }
    
    @RequestMapping("/test5/{userId}/{userName}")
    public String test5(@PathVariable(value="userId") int id,@PathVariable(value="userName") String userName){
        System.out.println(id + "---" + userName);
        return "test";
    }
}
view2Model

  @RequestParam注解表示當前參數是由請求發送來的
     required表示當前參數是否為必須的,若設為true,請求中若未包含相應參數,則會報400,設為false則無參的請求也可以訪問當前方法
     defaultValue表示當前若沒有傳參,則使用的默認參數。defaultValue添加之後,請求中沒有傳遞參數並且required設為true也可以進行訪問
     value表示傳參時,若請求中的參數名與方法中的參數名不匹配時,可以使用value制定請求中的參數名稱。
     例如  test?abc=hello  方法中的參數為str,則可以使用value=abc用來將abc中的值傳遞給str

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved