Spring MVC配置

  今天刚学习了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

posted on 2016-12-22 19:45  java-菜鸟  阅读(338)  评论(0)    收藏  举报

导航