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>
由于/会拦截静态资源,在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");
}
}

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");
}
}

不同方法传值(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"; } }
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"; } }
@RequestParam注解表示当前参数是由请求发送来的
required表示当前参数是否为必须的,若设为true,请求中若未包含相应参数,则会报400,设为false则无参的请求也可以访问当前方法
defaultValue表示当前若没有传参,则使用的默认参数。defaultValue添加之后,请求中没有传递参数并且required设为true也可以进行访问
value表示传参时,若请求中的参数名与方法中的参数名不匹配时,可以使用value制定请求中的参数名称。
例如 test?abc=hello 方法中的参数为str,则可以使用value=abc用来将abc中的值传递给str
浙公网安备 33010602011771号