博客
关于我
Java小白学习指南【day36】---SpringMVC配置及使用流程
阅读量:147 次
发布时间:2019-02-26

本文共 6884 字,大约阅读时间需要 22 分钟。

1、认识springMVC

作用:springMVC是表现层框架,底层对Servlet的封装,替代web程序中servelt 控制器那一程

回顾servlet作用:接收参数,处理请求,响应,跳转页面

方式:转发/重定向

执行流程:

image-20201209110635293

2、springMVC入门

  • 创建web动态项目

  • 导入响应jar包

    ① Spring核心容器相关jar包

    com.springsource.org.apache.commons.logging-1.1.1.jar

    spring-beans-4.1.2.RELEASE.jar

    spring-context-4.1.2.RELEASE.jar

    spring-core-4.1.2.RELEASE.jar

    spring-expression-4.1.2.RELEASE.jar

    ② Spring测试相关jar包

    spring-test-4.1.2.RELEASE.jar

    spring-aop-4.1.2.RELEASE.jar – Spring测试需要导入此包

    ③ SpringMVC相关jar包:

    spring-web-4.1.2.RELEASE.jar – Spring对web项目的支持

    spring-webmvc-4.1.2.RELEASE.jar – SpringMVC核心包

  • 在web.xml配置前端控制器

DispatcherServlet
org.springframework.web.servlet.DispatcherServlet
contextConfigLocation
classpath:spring-mvc.xml
1
DispatcherServlet
/

设置SpringMVC配置文件创建resources

3、前端控制器编写方式

共有三种方式,用的最多的为方式三:

方式一(实现org.springframework.web.servlet.mvc.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 HelloMvc implements Controller{   	//前端控制器编写的方式一,implements Controller	@Override	public ModelAndView handleRequest(HttpServletRequest arg0, HttpServletResponse arg1) throws Exception {   		System.out.println("你好controller!");		return null;	}}

方式二(实现 implements HttpRequestHandler )

import java.io.IOException;import javax.servlet.ServletException;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import org.springframework.web.HttpRequestHandler;import org.springframework.web.servlet.ModelAndView;import org.springframework.web.servlet.mvc.Controller;public class HelloMvc2 implements HttpRequestHandler {   	// 前端控制器编写的方式二,implements HttpRequestHandler	@Override	public void handleRequest(HttpServletRequest arg0, HttpServletResponse arg1) throws ServletException, IOException {   		System.out.println("我是前端控制器编写的方式二");	}}

方式三(普通类+注解)

import org.springframework.stereotype.Component;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.RequestMapping;//@Controller//spring会识别这个注解,进行扫描,并且创建该类的实例化对象@Component  //也可以使用@Component(普通类) 、 @Repository(dao层) 、@Service(service层)均可@RequestMapping("/user")public class HelloMvc3 {   	// 前端控制器编写的方式三,普通类+注解	@RequestMapping("/eat")	public void eat(){   		System.out.println("前端控制器编写的方式三,普通类+注解");	}	@RequestMapping("/put")	public void put(){   		System.out.println("Java是一门面向对象的语言");	}}

方式三还需要再spring-mvc.xml引入context命名空间及约束

4、全注解

  • 匹配请求:@RequestMapping(“/hehe”) 前提:spring-mvc.xml 开启注解支持

    可以写在类和方法上面

  • (1) 实例化对象:类所在包路劲,需要被是扫描

    <context:component-scan base-package=“cn.itsource”> 父包,所有子包都会被扫描

    <context:component-scan base-package=“cn.itsource._03Controller”> 精确扫描某个包:只会扫描本包

    只能放在类的上面

    ① @Controller

    ② @Service

    ③ @Repository 持久Dao

    ④ @Component 普通类

    注意: 相互使用

5、接收请求参数

共有四种方式:

  1. 通过传统的HttpServletRequest接收;

  2. 通过控制器的执行方法的参数接收;

  3. 通过对象来接收;

  4. 通过url中的参数接收(restfull风格) @PathVariable(“id”)转换;

@Controller@RequestMapping("/login")public class GetParamController {   	//通过请求获取	@RequestMapping("/form1")	public void parm1(HttpServletRequest req ){   		String name = req.getParameter("name");		String pwd = req.getParameter("pwd");		System.out.println(name+"---------"+pwd);	}	//通过参数获取	@RequestMapping("/form2")	public void parm2(String name , String pwd){   //参数名名字必须与xml中的对应		System.out.println(name+"---------"+pwd);	}	//使用对象进行获取	@RequestMapping("/form3")	public void parm3(User user){   //与类中字段名无关		System.out.println(user);	}	//restful风格:Url地址栏参数提取	@RequestMapping("/form4/{id}/{mm}")	public void parm4(@PathVariable("id")String name , @PathVariable("mm")String pwd){   //与类中字段名无关		System.out.println(name+"---------"+pwd);	}

6、过滤器

主要应对post请求乱码问题:可以自定义过滤器,SpringMVC写好的过滤器

web.xml中进行配置

filter
cn.xxxx.myfilter.MyFilter
enc
UTF-8
filter
过滤器路径匹配,所有文件都需要从过滤器过
/*
import java.io.IOException;import javax.servlet.Filter;import javax.servlet.FilterChain;import javax.servlet.FilterConfig;import javax.servlet.ServletException;import javax.servlet.ServletRequest;import javax.servlet.ServletResponse;//过滤器是去实现接口,因为是自己的去指定过滤规范public class MyFilter implements Filter{   	String enc;		//验证过滤器启动	public MyFilter(){   		System.out.println("这是过滤器");	}	@Override	public void destroy() {   			}	@Override	public void doFilter(ServletRequest req, ServletResponse resp, FilterChain arg2)			throws IOException, ServletException {   		System.out.println("开始过滤........");		req.setCharacterEncoding(enc);//对请求设定编码		arg2.doFilter(req, resp);//放行!	}		//初始化方法,就会获取参数,并且封装进对象中	@Override	public void init(FilterConfig arg0) throws ServletException {   		enc = arg0.getInitParameter("enc");		//System.out.println(enc);	}}
characterEncoding
org.springframework.web.filter.CharacterEncodingFilter
encoding
UTF-8
characterEncoding
/*

7、响应跳转向页面传值

共有三种方式:传递数据就是Controller往前台(页面)传递数据;

  1. 通过传统的HttpServletRequest传递;

  2. 通过ModelAndView对象传递;

  3. 通过Model对象传递;

@Controller@RequestMapping("/login")public class GetParamController {   	// 通过传统的HttpServletRequest传递	@RequestMapping("/form5")	public void parm5(HttpServletRequest req , HttpServletResponse resp) throws ServletException, IOException {   		req.setAttribute("message5", "你说什么鬼!");//存入请求对象,向前台共享数据		//转发的时候不会走视图解析器		req.getRequestDispatcher("/jsp/model2.jsp").forward(req, resp);	}		// 通过传统的Model传递	@RequestMapping("/form6")	public String parm6(Model model) {   //就当作是request对象		model.addAttribute("message6", "太累了!!");		//这里还可以传一个集合,数组,或者对象		User user = new User("你是谁","6666");		model.addAttribute("user", user);		//return "/jsp/model2.jsp";//返回的是一个路径		//使用视图解析器		//return "jsp/model2";//返回的是一个路径		//转发是不会走视图解析器,开始的/区别于绝对路径与相对路径		//return "forward:/jsp/model2.jsp";//转发的绝对路径		//return "forward:jsp/model2.jsp";//转发的相对路径  /login/jsp/model2.jsp,相对于当前设定的地址		//重定向不能够取值,所以前端看不到值		return "redirect:/jsp/model2.jsp";	}	// 通用ModelAndView对象传递	@RequestMapping("/form7")	public ModelAndView parm7() {   		ModelAndView mv = new ModelAndView();		mv.addObject("message7", "奈史密斯");  		mv.setViewName("/jsp/model2.jsp");		return mv;	}

8、Spring-MVC.xml中配置视图解析器

SpringMVC默认是转发

  • 显示forword: 转发:不会经过视图解析器 一般不用

    • forword:/jsp/model2.jsp 加了斜杠绝对路劲
    • forword:jsp/model2.jsp 相对路劲,相对于当前的路劲 /login/jsp/model2.jsp
  • 显示redirect: 重定向: 不会经过视图解析器

请求转发(forward) 重定向(redirect)
访问WEB-INF *√* *X*
request传参 *√* *X*
全新请求(URL变化) *X* *√*
访问外网 *X* *√*

转载地址:http://jfeu.baihongyu.com/

你可能感兴趣的文章
Mysql 学习总结(87)—— Mysql 执行计划(Explain)再总结
查看>>
Mysql 学习总结(88)—— Mysql 官方为什么不推荐用雪花 id 和 uuid 做 MySQL 主键
查看>>
Mysql 学习总结(89)—— Mysql 库表容量统计
查看>>
mysql 实现主从复制/主从同步
查看>>
mysql 审核_审核MySQL数据库上的登录
查看>>
mysql 导入 sql 文件时 ERROR 1046 (3D000) no database selected 错误的解决
查看>>
mysql 导入导出大文件
查看>>
MySQL 导出数据
查看>>
mysql 将null转代为0
查看>>
mysql 常用
查看>>
MySQL 常用列类型
查看>>
mysql 常用命令
查看>>
Mysql 常见ALTER TABLE操作
查看>>
MySQL 常见的 9 种优化方法
查看>>
MySQL 常见的开放性问题
查看>>
Mysql 常见错误
查看>>
mysql 常见问题
查看>>
MYSQL 幻读(Phantom Problem)不可重复读
查看>>
mysql 往字段后面加字符串
查看>>
mysql 快照读 幻读_innodb当前读 与 快照读 and rr级别是否真正避免了幻读
查看>>