一:SpringMVC简介
1:SpringMVC的重要组件
(1):DispatcherServlet:前端控制器,接受所有请求(如果配置/不包含jsp)
(2):HandlerMapping 请求解析格式的,判断希望要执行哪个具体的方法
(3):HandlerAdapter:负责调用具体的方法
(4):ViewResovler:视图解析器,解析结果,准备跳转到具体的物理视图
2:Spring运行原理图
3:Spring容器和SpringMVC容器的关系
(1):SpringMVC容器是Spring容器的子容器
(2):SpringMVC容器可以调用Spring容器中的内容
二:入门代码
1:新建包controller,在包下新建类DemoController
package controller;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;
public class DemoController implements Controller{
@Override
public ModelAndView handleRequest(HttpServletRequest arg0, HttpServletResponse arg1) throws Exception {
// TODO Auto-generated method stub
System.out.println("执行了springmvc的控制器");
ModelAndView mav=new ModelAndView("main");
return mav;
}
}
2:在src目录下新建文件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.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd" default-autowire="byName">
<bean id="demo1" class="controller.DemoController"></bean>
<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="urlMap">
<map>
<!-- 解析出控制器逻辑名 -->
<entry key="demo" value-ref="demo1"></entry>
</map>
</property>
</bean>
<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"></bean>
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/"></property>
<property name="suffix" value=".jsp"></property>
</bean>
</beans>
3:在WebContent目录下新建main.jsp
<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%>
<!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=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
hello springmvc
</body>
</html>
4:配置web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
<display-name>Spring-mvc</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 修改配置文件路径和名称 -->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc.xml</param-value>
</init-param>
<!-- 自启动 -->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
5:启动Tomcat,在浏览器输入http://localhost:8080/Spring-mvc/demo
三:SpringMVC环境搭建
1:在web.xml中额配置前端控制器Dispather和编码过滤器
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
<display-name>Spring-mvc2</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
<servlet>
<servlet-name>springmvc1</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>springmvc1</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<!-- 配置字符编码过滤器 -->
<filter>
<filter-name>encoding</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>
</filter>
<filter-mapping>
<filter-name>encoding</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
2:在src下新建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:mvc="http://www.springframework.org/schema/mvc"
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">
<!-- 扫描注解 -->
<context:component-scan base-package="controller"></context:component-scan>
<!-- 注解驱动 -->
<mvc:annotation-driven></mvc:annotation-driven>
<!-- 静态资源 -->
<mvc:resources location="/js/" mapping="/js/**"></mvc:resources>
<mvc:resources location="/css/" mapping="/css/**"></mvc:resources>
<mvc:resources location="/images/" mapping="/images/**"></mvc:resources>
<!-- 默认的静态资源处理器,使用如下配置便不需要配置<mvc:resources> -->
<!-- <mvc:default-servlet-handler/> -->
</beans>
3:在controller包编写控制器类DemoController
package controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
@Controller
public class DemoController {
@RequestMapping("demo1")
public String demo1() {
System.out.println("执行demo1");
return "main.jsp";
}
/*
* 当参数名和请求的参数名相同时,浏览器给控制器传参
*/
@RequestMapping("demo2")
public String demo2(String name) {
System.out.println("执行demo2:"+" "+name);
return "main.jsp";
}
/*
* 当参数名和请求的参数名不同时,浏览器给控制器传参
*/
@RequestMapping("demo3")
public String demo3(@RequestParam(value="name")String name1) {
System.out.println("执行demo3:"+" "+name1);
return "main.jsp";
}
/*
* 如果参数方法是基本数据类型,可以给参数设置默认值
*/
@RequestMapping("demo4")
public String demo4(@RequestParam(defaultValue="18")int age){
System.out.println("执行demo4:"+" "+age);
return "main.jsp";
}
/**
* 如果强制要求必须有某个参数
*/
@RequestMapping("demo5")
public String demo5(@RequestParam(required=true)String name) {
System.out.println("执行demo5:"+" "+name);
return "main.jsp";
}
}
4:在WebContent下新建main.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>main1</title>
</head>
<body>
我是main
</body>
</html>
5:运行项目
四:复杂的传参
1:方法中的参数是对象类型
该类型必须实现set/get方法
(1):jsp中的代码
<input type="text" name="peo.name"/>
<input type="text" name="peo.age"/>
(2):DemoController的代码
@RequestMapping("demo")
public String demo(People peo){
return "main.jsp";
}
2:请求参数中传递集合对象类型参数
(1):jsp中的代码
<input type="text" name="peo[0].name"/>
<input type="text" name="peo[0].age"/>
<input type="text" name="peo[1].name"/>
<input type="text" name="peo[1].age"/>
(2):DemoController的代码
@RequestMapping("demo")
public String demo(List<People> peo){
System.out.println(peo);
return "main.jsp";
}
3:restful传值方式
(1):在jsp中
<a href="demo/123/abc">跳转</a>
(2):在Controller中
@RequestMapping("demo/{id1}/{name}")
public String demo(@PathVariable String name,@PathVariable("id1") int age){
System.out.println(name +" "+age);
return "/main.jsp";
}
五:跳转方式
1:return redirect:main.jsp 重定向到main.jsp
2:return forword:main.jsp 默认方式,相当于return main.jsp,请求转发到main.jsp
六:@ResponseBody
1:用在Controller类的方法上
2:在方法上只有@RequestMapping时,无论方法返回值是什么,认为需要跳转
3:在@RequestMapping下添加@ResponseBody(恒不跳转)
(1):如果返回值满足key-value形式(对象或map)
(a):把响应头设置为application/json;charset="utf-8"
(b):把转换后的内容输出流的形式响应给客户端
(c):在项目中一定要导入jackson的jar,spring4.1.6 对 jackson 不支持较高版本,jackson 2.7 无效
(2):如果返回值满足key-value形式,例如String
(a): 把相应头设置为 text/html
(b):把方法返回值以流的形式直接输出.
(c):如果返回值包含中文,出现中文乱码,produces 表示响应头中 Content-Type
@RequestMapping(value="demo",produces="text/html;charset=utf-8")
@ResponseBody
public String demo() throws IOException{
return "中文";
}
注:
//SpringMVC中获取Spring上下文,与Spring整合Servlet一样
WebApplicationContext springContext=
WebApplicationContextUtils.getWebApplicationContext(request.getSession().getServletContext());
//SpringMVC中获取SpringMVC上下文
WebApplicationContext springMVCContext=RequestContextUtils.getWebApplicationContext(request);
七:控制器的路径问题
package myController;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
@RequestMapping("/demo") //针对项目的根目录,开头有没有"/"效果一样
public class DemoController {
@RequestMapping("/test1") //针对DemoController配置的@RequestMapping("/demo"),开头有没有"/"效果一样
public String test1() {
return "/test1.jsp"; //针对项目的根目录
}
@RequestMapping("/test2")
public String test2() {
return "test2.jsp";//针对进入/demo/test2的相对路径,即/demo/test2.jsp
}
@RequestMapping("/test3")
public String test3() {
return "redirect:/test3.jsp";//加上redirect或forward会忽略视图解析器
}
}