B039-SpringMVC基础

目录

      • SpringMVC简介
      • 复习servlet
      • SpringMVC入门
        • 导包
        • 配置前端控制器
        • 编写处理器
          • 实现Contoller接口
          • 普通类加注解(常用)
        • 路径问题
        • 获取参数的方式
        • 过滤器简介
          • 自定义过滤器
          • 配置框架提供的过滤器
        • springMVC向页面传值的三种方式
        • 视图解析器
        • springMVC的转发和重定向

SpringMVC简介

1.SpringMVC是一个基于MVC模式的WEB/表现层框架,它解决WEB开发中常见的问题:参数接收、文件上传/下载、表单验证、国际化等等;
2.SpringMVC作为Spring框架一个非常重要的功能模块,可以与Spring无缝集成,提高开发效率;
3.Spring是一个轻量级的Java 开发框架,为了解决企业应用开发的复杂性而创建。SpringMVC以Spring框架为核心,为应用程序中的Web层(表现层)提出的一套优秀的解决方案;
4.目前很多公司都使用SpringMVC,90%的招聘单位要求熟悉使用SpringMVC;
注意:SpringMvc的功能就是之前Servlet的功能,可以理解为使用SpringMVC代替了Servlet;
B039-SpringMVC基础_第1张图片

复习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入门

导包

SpringMvc是Spring的一个模块,所以要用SpringMvc需要导入Spring的jar包
B039-SpringMVC基础_第2张图片
tips:动态web工程一般导完包后会自动编译,不用手动build path

配置前端控制器

以前servlet的方式
B039-SpringMVC基础_第3张图片
现在的方式
B039-SpringMVC基础_第4张图片
前端控制器就是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.普通类加注解(常用)

实现Contoller接口

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:过滤器
作用:乱码问题,过滤非法字符
执行时机:请求到达前端控制器之前
B039-SpringMVC基础_第5张图片
B039-SpringMVC基础_第6张图片

自定义过滤器

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>
springMVC向页面传值的三种方式

方式一:
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";   //返回页面
	}
springMVC的转发和重定向

DataController

	/**
	 * 转发和重定向
	 * 使用forward(转发)和redirect(重定向)都不会走视图解析器,但它们之间的区别还是存在
	 */
	@RequestMapping("/handler4")
	public String handler4(){
		// 默认是转发   走视图解析器
		// return "data";
		// 不走视图解析器   forward:转发
		// return "forward:/index.html";
		// 不走视图解析器   redirect:重定向
		return "redirect:/index.html";
	}

B039-SpringMVC基础_第7张图片

你可能感兴趣的:(笔记总结,SpringMVC)