1.SpringMVC是一个基于MVC模式的WEB/表现层框架,它解决WEB开发中常见的问题:参数接收、文件上传/下载、表单验证、国际化等等;
2.SpringMVC作为Spring框架一个非常重要的功能模块,可以与Spring无缝集成,提高开发效率;
3.Spring是一个轻量级的Java 开发框架,为了解决企业应用开发的复杂性而创建。SpringMVC以Spring框架为核心,为应用程序中的Web层(表现层)提出的一套优秀的解决方案;
4.目前很多公司都使用SpringMVC,90%的招聘单位要求熟悉使用SpringMVC;
注意:SpringMvc的功能就是之前Servlet的功能,可以理解为使用SpringMVC代替了Servlet;
见代码:
创建动态web工程 - HelloServlet - web.xml - Tomcat
HelloServlet
public class HelloServlet extends HttpServlet{
@Override
protected void service(HttpServletRequest arg0, HttpServletResponse arg1) throws ServletException, IOException {
System.out.println("进来了");
}
}
web.xml
<servlet>
<servlet-name>helloServletservlet-name>
<servlet-class>cn.ming.controller.HelloServletservlet-class>
servlet>
<servlet-mapping>
<servlet-name>helloServletservlet-name>
<url-pattern>/hellourl-pattern>
servlet-mapping>
部署到Tomcat,浏览器访问localhost/hello
tips:
1.Target runtime:选上tomcat后就自动导入了相关jar包,不用再去lib添加相关jar包
2.Dynamic web module version:选3.0以上版本,因为支持注解,如@webservlet
3.创建动态web工程后怎么修改classes路径?
项目右键 - build path - Configure Build Path - source - 放到WEB-INF下的classes
4.为什么部署到webapp而不是部署到项目根目录?
因为WEB-INF下有看不到的classes路径,外面的java代码已编译到里面
SpringMvc是Spring的一个模块,所以要用SpringMvc需要导入Spring的jar包
tips:动态web工程一般导完包后会自动编译,不用手动build path
以前servlet的方式
现在的方式
前端控制器就是springMVC提供的servlet,接收所有请求但不处理请求,发给处理器即一个个方法去处理,所以需要配置前端控制器
web.xml
<servlet>
<servlet-name>dispatcherServletservlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServletservlet-class>
<init-param>
<param-name>contextConfigLocationparam-name>
<param-value>classpath:springMVC.xmlparam-value>
init-param>
<load-on-startup>1load-on-startup>
servlet>
<servlet-mapping>
<servlet-name>dispatcherServletservlet-name>
<url-pattern>/hellourl-pattern>
servlet-mapping>
springMVC.xml
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
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
">
beans>
业务处理控制器的三种实现:
1.实现Contoller接口
2.实现HttpRequestHandler接口
3.普通类加注解(常用)
HelloController
public class HelloController implements Controller{
@Override
public ModelAndView handleRequest(HttpServletRequest arg0, HttpServletResponse arg1) throws Exception {
System.out.println("我是HelloController");
return null;
}
}
springMVC.xml
<bean name="/hello.do" class="cn.ming.controller.HelloController">bean>
web.xml
<servlet-mapping>
<servlet-name>dispatcherServletservlet-name>
<url-pattern>*.dourl-pattern>
servlet-mapping>
上面这两种太局限:方法名固定了,参数固定,返回值固定,还要实现一个接口。所以后面都用第三种
HiController
@Controller // 代表当前这个类就是controller 交给spring管理 不用再配置bean
//@RequestMapping("/hi")
public class HiController {
@RequestMapping("/hello.do")
public void handler1() {
System.out.println("我回来了");
}
public void handler2() {
}
public void handler3() {
}
}
springMVC.xml
<context:component-scan base-package="cn.ming.controller" />
后缀匹配:匹配的范围太小
/*:匹配所有请求,会将css,html,jsp都匹配上,一般用在过滤器,对于restful不友好
/:匹配所有请求,最常用,不会拦截.jsp,但是会拦截静态资源(css,html,images)(/替代了tomcat中默认处理静态资源的Servlet),所以需要配置静态资源放行,但是这又会导致@RequestMapping等注解失效,所以还要加上使spring注解生效的配置
代码:
web.xml
<servlet-mapping>
<servlet-name>dispatcherServletservlet-name>
<url-pattern>/url-pattern>
servlet-mapping>
springMVC.xml
<mvc:default-servlet-handler/>
<mvc:annotation-driven />
webapp下新建index.html
<html>
<head>
<meta charset="UTF-8">
<title>Insert title heretitle>
head>
<body>
<h1>hello worldh1>
body>
html>
HiController
@Controller // 代表当前这个类就是controller 交给spring管理 不用再配置bean
//@RequestMapping("/hi")
public class HiController {
@RequestMapping("/hello.do")
public void handler1() {
System.out.println("我回来了");
}
@RequestMapping("/hi.do")
public void handler2() {
System.out.println("hi.do。。");
}
@RequestMapping("/hei")
public void handler3() {
System.out.println("hei.....");
}
}
启动tomcat分别测试访问页面和controller
tips:浏览器访问默认发get请求,表单可以自己选发get或post
ParamController
/**
* springMVC接收参数的四种方式
*/
@Controller
public class ParamController {
/**
* 一般不用 以前的方式
* http://localhost/handler1?name=zs
*/
@RequestMapping("/handler1") // 请求的路径
public void handler1(HttpServletRequest request){
String name = request.getParameter("name");
System.out.println(name);
}
/**
* 常用 重点 类型要符合,名称要相同
* http://localhost/handler2?name=ls&age=18
*/
@RequestMapping("/handler2") // 请求的路径
public void handler2(String name,Integer age){
System.out.println(name);
System.out.println(age);
}
/**
* 常用 重点 对象接收参数
* http://localhost/handler3?name=ls&age=18
*/
@RequestMapping("/handler3") // 请求的路径
public void handler3(User user){
System.out.println(user);
}
/**
* 暂时不用 restful风格方式
* localhost:80/handler4/zs/30
*/
@RequestMapping("/handler4/{name}/{age}") // 请求的路径
public void handler4(@PathVariable("name")String name, @PathVariable("age")Integer age){
System.out.println(name);
System.out.println(age);
}
}
启动tomcat,浏览器访问
tips:浏览器地址栏默认都是get,发post请求可以用表单指定,get请求在tomcat里自己解决了中文乱码,而post需要自己解决中文乱码
代码里每个处理器都设置字符集太麻烦,所以现在用filter过滤器
filter:过滤器
作用:乱码问题,过滤非法字符
执行时机:请求到达前端控制器之前
form.html
<html>
<head>
<meta charset="UTF-8">
<title>Insert title heretitle>
head>
<body>
<form action="/handler3" method="post">
name: <input type="text" name="name"><br/>
age: <input type="text" name="age"><br/>
<input type="submit" value="提交">
form>
body>
html>
MyFilter
public class MyFilter implements Filter{
//初始化方法
@Override
public void init(FilterConfig arg0) throws ServletException {
}
//处理具体的内容
@Override
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain)
throws IOException, ServletException {
System.out.println("filter。。。。。。");
// 处理乱码问题
req.setCharacterEncoding("utf-8");
// 放行
chain.doFilter(req, resp);
}
//销毁方法
@Override
public void destroy() {
}
}
web.xml
<filter>
<filter-name>myFilterfilter-name>
<filter-class>cn.ming.filter.MyFilterfilter-class>
filter>
<filter-mapping>
<filter-name>myFilterfilter-name>
<url-pattern>/*url-pattern>
filter-mapping>
浏览器访问
web.xml
<filter>
<filter-name>characterEncodingfilter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilterfilter-class>
<init-param>
<param-name>encodingparam-name>
<param-value>UTF-8param-value>
init-param>
<init-param>
<param-name>forceEncodingparam-name>
<param-value>trueparam-value>
init-param>
filter>
<filter-mapping>
<filter-name>characterEncodingfilter-name>
<url-pattern>/*url-pattern>
filter-mapping>
方式一:
DataController
@Controller
@RequestMapping("/data")
public class DataController {
/**
* 向页面传值方式一: 不常用。。。
*/
@RequestMapping("/handler1")
public ModelAndView handler1(){
ModelAndView mv = new ModelAndView();
// 向request域存值
mv.addObject("name","tom");
mv.addObject("age",30);
// 跳转到页面
mv.setViewName("/WEB-INF/views/data.jsp");
return mv;
}
/**
* 向页面传值方式二: 常用
*/
@RequestMapping("/handler2")
public String handler2(Model model){
// 向request域存值
model.addAttribute("name", "王天霸");
model.addAttribute("age", "40");
return "/WEB-INF/views/data.jsp";
}
/**
* 向页面传值方式三 : 常用
*/
@RequestMapping("/handler3")
public String handler3(Map<String,Object> map){
// 向request域存值
map.put("name", "力很弱");
map.put("age", 60);
return "/WEB-INF/views/data.jsp"; //返回页面
}
}
data.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>Insert title heretitle>
head>
<body>
${name}<br/>
${age}
body>
html>
视图解析器:把页面的前后缀配置起来,后面就都只需要简写
springMVC.xml
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/views/">property>
<property name="suffix" value=".jsp">property>
bean>
DataController
/**
* 向页面传值方式三 : 常用
*/
@RequestMapping("/handler3")
public String handler3(Map<String,Object> map){
// 向request域存值
map.put("name", "力很弱");
map.put("age", 60);
return "data"; //返回页面
}
DataController
/**
* 转发和重定向
* 使用forward(转发)和redirect(重定向)都不会走视图解析器,但它们之间的区别还是存在
*/
@RequestMapping("/handler4")
public String handler4(){
// 默认是转发 走视图解析器
// return "data";
// 不走视图解析器 forward:转发
// return "forward:/index.html";
// 不走视图解析器 redirect:重定向
return "redirect:/index.html";
}