Day01
一.SpringMVC简介
1.SpringMVC中重要组件
1.1 DispatcherServlet: 前端控制器,接收所有请求(如果配置成/不包含jsp)
1.2 HandlerMapping:解析请求格式,判断要执行哪个具体的方法
1.3 HandlerAdapter: 负责调用具体的方法
1.4 ViewResovler: 视图解析器,解析结果,准备跳转到具体的物理视图
2.springMVC运行原理图
3. spring容器和springMVC容器的关系
3.1代码如下:
<br /> 3.2 Spring容器和SpringMVC容器是父子容器<br /> 3.2.1 SpringMVC容器中能够调用Spring容器的所有内容<br /> 3.2.2 图示
二. SpringMVC 环境搭建
1. 导入jar
2.在web.xml中配置前端控制器DispatcherServlet
2.1 如果不配置
<?xml version=“1.0” encoding=“UTF-8”?> xsi:schemaLocation=“http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd”> |
---|
3. 在src下新建spring.xml
3.1 引入xmlns:mvc命名空间
3.2 放行静态资源:
3.2.1 location=“/js/“ mapping=“/js/**” **的值是什么,就在location中找什么
<?xml version=“1.0” encoding=“UTF-8”?> 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”> ** <!—放行静态资源 — <mvc:resources location=“/js/“ mapping=_”/js/“> <mvc:resources location=“/css/“ mapping=“/css/“> <mvc:resources location=“/images/“ mapping=“/images/“_> |
---|
4. 编写控制器类
4.1 @ResultMapping(“”) 类似于servlet中 WebServlet(“”)
4.2 String类型返回值,返回什么,页面向哪里转发
@Controller public class DemoController { @RequestMapping(“demo”) public String demo(){ System.out.println(“执行demo”); return “main.jsp”; } @RequestMapping(“demo2”) public String demo2(){ System.out.println(“demo2”); return “main1.jsp”; } } |
---|
三. 字符编码过滤器
1.在web.xml中配置Filter(全局过滤器)
四. 传参
1.把内容写道方法(HandlerMethod)参数中,SpringMVC只要有这个内容,就会自动注入内容
2.基本数据类型参数
2.1 默认保证参数名称和请求中传递的参数名相同
@Controller public class DemoController { @RequestMapping(“demo”) public String demo(People p,String name,int age,HttpServletRequest req){ System.out.println(“执行demo”); req.setAttribute(“demo123”, “测试”); System.out.println(p+” “+name+” “+age); return “main.jsp”; } } |
---|
2.2 如果请求参数名和方法参数名不对应,可以使用@RequestParam()赋值
@RequestMapping(“demo”) public String demo(@RequestParam(value=”name1”) String name,@RequestParam(value=”age1”) int age){ System.out.println(“执行demo”); System.out.println(name+” “+age); return “main.jsp”; } |
---|
2.3 如果希望方法参数是基本数据类型(不是封装类),可以通过@RequestParam设置默认值<br /> 2.3.1 防止没有参数时500错误
@RequestMapping(“page”) public String page(@RequestParam(defaultValue=”2”) int pageSize,@RequestParam(defaultValue=”1”) int pageNumber) { System.out.println(pageSize+” “+pageNumber); return “main.jsp”; } |
---|
2.4如果强制要求必须有某个参数
2.4.1注意,required=true和defaultValue一起用的时候,required恒不成立
@RequestMapping(“demo2”) public String demo2(@RequestParam(required=true) String name) { System.out.println(“name是SQL的查询条件,必须要传递name参数”+name); return “main.jsp”; } |
---|
3. HandlerMethod 中参数时对象类型
3.1 只需要请求参数名和对象中属性名对应(get/set方法)
@RequestMapping(“demo4”) public String demo4(People peo) { System.out.println(peo); return “main.jsp”; } |
---|
4. 请求参数中包含多个同名参数的获取方式
4.1 复选框传递的参数就是多个同名参数
学习 写代码 看视频 看笔记 |
---|
@RequestMapping(“demo5”) public String demo5(String name,int age,@RequestParam(“hover”) List System.out.println(name+” “+age+” “+hover); return “main.jsp”; } |
5.请求参数中 对象.属性 格式
5.1 jsp中代码
5.2 新建一个类<br /> 5.2.1 对象名和参数中点前面名称对应
public class Demo { private People peo; } |
---|
5.3 控制器
@RequestMapping(“demo6”) public String demo6(Demo demo) { System.out.println(demo); return “main.jsp”; } |
---|
6.在请求参数中传递集合对象类型参数
6.1 jsp中代码
6.2 新建类
public class Demo { private List public List return peo; } public void setPeo(List this.peo = peo; } @Override public String toString() { return “Demo [peo=” + peo + “]”; } } |
---|
6.3 控制器
@RequestMapping(“demo6”) public String demo6(Demo demo) { System.out.println(demo); return “main.jsp”; } |
---|
- restful传值方式(重要)
7.1 简化jsp中参数编写格式
7.2 在jsp中设置特定的格式
跳转 |
---|
7.3 在控制器中编写项目代码<br /> 7.3.1 在@RequestMapping中一定要和请求格式对应<br /> 7.3.2 {名称} 中名称是自定义名称,随意起<br /> 7.3.3 @PathVariable 获取@RequestMapping中的内容,默认按照方法参数名称去寻找
@RequestMapping(“demo8/{name}/{age}”) public String demo8(@PathVariable(value=”name”) String name,@PathVariable(“age”) int age) { System.out.println(name+” “+age); return “/main.jsp”; } |
---|
四. 跳转方式
- 默认跳转方式请求转发
2. 设置返回值字符串内容
2.1 添加 redirect:资源路径 重定向
2.2 添加 forward:资源路劲 或省略forward 转发
2.3 无返回值不跳转五.视图解析器
1.SpringMVC会提供默认视图解析器
2.程序员可以自定义视图解析器
2.1 在spring.xml中配置
3.如果希望不执行视图解析器,可以在方法返回值前面添加forward: 或者 redirect:
@RequestMapping(“demo10”) public String demo10() { return “forward:demo11”; } @RequestMapping(“demo11”) public String demo11() { System.out.println(“demo11”); return “main”; } |
---|
六. @ResponseBody(需要导入jackson包)
- 在方法上只有@RequestMapping时,无论方法返回值是什么,都认为跳转
2. 在方法上添加@ResponseBody时(恒不跳转)
2.1 如果返回值满足key-value形式(对象或者map)
2.1.1把响应头设置为application/json;charset=utf-8
2.1.2把转换后的内容以输出流的形式响应给客户端
2.2 如果返回值不满足key-value形式,例如返回值为字符串
2.2.1把响应头设置为text/html
2.2.2把方法返回值以流的形式直接输出
2.2.3 如果返回值包含中文,会出现中文乱码,需要设置@RequestMapping(produces=”text/html;charset=utf-8”)
2.2.3.1 produces表示响应头中Content-Type取值
@RequestMapping(value=”demo12”,produces=”text/html;charset=utf-8”) @ResponseBody public String demo12() throws IOException { People p = new People(); p.setAge(12); p.setName(“张三”); return “中文不乱码”; } |
---|
Day02
一.JSP九大内置对象和四大作用域复习
1.九大内置对象
名称 | 类型 | 作用 | 获取方式 |
---|---|---|---|
request | HttpServletRequest | 封装所有请求信息 | 方法参数 |
response | HttpServletResponse | 封装所有相应信息 | 方法参数 |
session | HttpSession | 封装所有会话信息 | req.getSession |
application | ServletContext | 所有信息 | getServletContext(); request.getServletContext(); |
out | PrintWriter | 输出对象 | response.getWriter() |
exception | Exception | 异常对象 | |
page | Object | 当前页面对象 | |
pageContext | PageContext | 获取其他对象 | |
config | ServletConfig | 配置信息 |
2.四大作用域
2.1 page
2.1.1 在当前页面不会重新实例化
2.2 request
2.2.1 在一次请求中同一个对象,下次请求重新实例化一个request对象
2.3 session
2.3.1 一次会话
2.3.2 只要客户端传递的Jessionid 不变,Session不会重新实例化(不超过默认时间)
2.3.3 实际有效时间:
2.3.3.1 浏览器关闭,cookie失效
2.3.3.2 默认事件,在时间范围内无任何交互。在tomcat的web.xml中配置
2.4 application
2.4.1 只有在tomcat启动项目时实例化,关闭tomcat时销毁application
二. SpringMVC作用域传值的几种方式
1.使用原生Servlet
1.1 在HandlerMethod(控制器方法)参数中添加作用域对象
@RequestMapping(“demo1”) public String demo1(HttpServletRequest req,HttpSession sessionParam) { //request作用域 req.setAttribute(“req”, “req的值”); //session作用域 HttpSession session = req.getSession(); session.setAttribute(“session”, “session值”); sessionParam.setAttribute(“sessionParam”, “sessionParam的值”); //application作用域 ServletContext application = req.getServletContext(); application.setAttribute(“application”, “application的值”); return “index”; } |
---|
2. 使用Map集合
2.1 把map中内容放在了request作用域中
2.2 spring会对map集合通过BindingAwareModelMap进行实例化
@RequestMapping(“demo2”) public String demo2(Map map.put(“map”, “map的值”); return “index”; } |
---|
3. 使用SpringMVC中Model接口(request作用域中)
3.1 把内容最终放入到request作用域红。
@RequestMapping(“demo3”) public String demo3(Model model) { model.addAttribute(“model”,”model的值”); return “index”; } |
---|
model:${requestScope.model } |
4.使用SpringMVC中ModelAndView类(request作用域中)
@RequestMapping(“demo4”) public ModelAndView demo4() { //参数表示跳转视图 ModelAndView mav = new ModelAndView(“index”); mav.addObject(“mav”,”mav的值”); return mav; } |
---|
mav:${requestScope.mav } |
三. 文件下载
1.访问资源时,响应头如果没有设置Content-Disposition,浏览器默认按照inline值进行处理
1.1 inline 能显示就显示,不能显示就下载
2. 只需要修改响应头中Context:Disposition=”attachment;filename=文件名”
2.1 attachment: 下载,以附件形式下载
2.2 filename=“” 值就是下载时显示的下载文件名
3. 实现步骤
3.1 导入apatch的两个jar
3.2 在jsp中添加超链接,设置要下载的文件 <br /> 3.2.1 在springmvc中放行静态资源files文件夹
下载txt |
---|
3.3 编写控制器方法
@Controller public class DemoController { @RequestMapping(“download”) public void download(String fileName, HttpServletResponse resp, HttpServletRequest req) throws IOException { // 获得输出字节流 // resp.setContentType(type);与 resp.setHeader(“Content-Type”,”type”)等效 // 设置相应流中文件进行下载,a-copy.txt为下载后的文件名 resp.setHeader(“Content-Disposition”, “attachment;filename=”+fileName); // 把二进制流放入到响应体中 ServletOutputStream os = resp.getOutputStream(); // 获取资源文件夹的完整路径 String realPath = req.getServletContext().getRealPath(“files”); File flie = new File(realPath, fileName); byte[] bytes = FileUtils.readFileToByteArray(flie);//将文件读成字节数组 os.write(bytes); os.flush(); os.close(); } } |
---|
四. 文件上传
- 基于apache的commons-fileupload.jar完成文件上传
2. MultipartResovler作用:
2.1 把客户端上传的文件流转换成MutipartFile封装类
2.2 通过Multipart封装类获取到文件流
3. 表单数据类型分类
3.1 在
** 姓名: 文件: |
---|
4.3 配置springmvc.xml
4.4 编写控制器类
4.4.1 MultipartFile对象名必须和的name属性值相同
@Controller public class DemoController { @RequestMapping(“upload”) public String upload(MultipartFile file, String name) throws IOException { // 参数名称需要和jsp中传来的参数名对应 System.out.println(“name:” + name); String fileName = file.getOriginalFilename(); // 获取文件名 String uuid = UUID.randomUUID().toString(); // 随机获取字符串为文件名 String suffix = fileName.substring(fileName.lastIndexOf(“.”)); // 取得文件的后缀名 // 判断上传文件类型 if (suffix.equalsIgnoreCase(“.png”)) { FileUtils.copyInputStreamToFile(file.getInputStream(), new File(“D:/“ + uuid + suffix));// 获取输入流,选择存储位置 return “index”; } else { return “error.jsp”; } } } |
---|
完整配置文件
1.web.xml
<?xml version=“1.0” encoding=“UTF-8”?> xsi:schemaLocation=“http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd”> |
---|
2.spring配置文件
<?xml version=“1.0” encoding=“UTF-8”?> 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”> |
---|
3.springMVC配置文件
<?xml version=“1.0” encoding=“UTF-8”?> 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”> |
---|
4.db.properties
jdbc.driver=com.mysql.jdbc.Driver jdbc.url = jdbc:mysql://localhost:3306/ssm jdbc.username = root jdbc.password =123456 |
---|
5.mapper.xml
<?xml version=“1.0” encoding=“UTF-8”?> <!DOCTYPE mapper PUBLIC “-//mybatis.org//DTD Mapper 3.0//EN” “http://mybatis.org/dtd/mybatis-3-mapper.dtd"> |
---|
6. log4j.properties
log4j.rootCategory=ERROR, CONSOLE , LOGFILE log4j.logger.com.tjc.mapper=DEBUG log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout log4j.appender.CONSOLE.layout.ConversionPattern=%C %d{YYYY-MM-dd hh:mm:ss} %L %m %n log4j.appender.LOGFILE=org.apache.log4j.FileAppender log4j.appender.LOGFILE.File=G:/my.log log4j.appender.LOGFILE.Append=true log4j.appender.LOGFILE.layout=org.apache.log4j.PatternLayout log4j.appender.LOGFILE.layout.ConversionPattern=%C %m %L %n |
---|