Day01

一.SpringMVC简介

1.SpringMVC中重要组件
1.1 DispatcherServlet: 前端控制器,接收所有请求(如果配置成/不包含jsp)
1.2 HandlerMapping:解析请求格式,判断要执行哪个具体的方法
1.3 HandlerAdapter: 负责调用具体的方法
1.4 ViewResovler: 视图解析器,解析结果,准备跳转到具体的物理视图






2.springMVC运行原理图


3. spring容器和springMVC容器的关系
3.1代码如下:

  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 如果不配置会在 /WEB-INF/找servlet.xml

<?xml version=“1.0” encoding=“UTF-8”?>
xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance
xsi:schemaLocation=http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd”>


jqk
org.springframework.web.servlet.DispatcherServlet

contextConfigLocation
classpath:springmvc.xml

1


jqk
/


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: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”>
**


<!—放行静态资源 —
<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(全局过滤器)



encoding
org.springframework.web.filter.CharacterEncodingFilter

encoding
utf-8



encoding

/*

四. 传参

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”;
}
}
  1. 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”;
}

姓名:
年龄:

  1. 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 hover) {
System.out.println(name+” “+age+” “+hover);
return “main.jsp”;
}


5.请求参数中 对象.属性 格式
5.1 jsp中代码


  1. 5.2 新建一个类<br /> 5.2.1 对象名和参数中点前面名称对应

public class Demo {

private People peo;

}
  1. 5.3 控制器
@RequestMapping(“demo6”)
public String demo6(Demo demo) {
System.out.println(demo);
return “main.jsp”;
}


6.在请求参数中传递集合对象类型参数
6.1 jsp中代码




  1. 6.2 新建类
public class Demo {

private List peo;

public List getPeo() {
return peo;
}

public void setPeo(List peo) {
this.peo = peo;
}

@Override
public String toString() {
return “Demo [peo=” + peo + “]”;
}

}
  1. 6.3 控制器
@RequestMapping(“demo6”)
public String demo6(Demo demo) {
System.out.println(demo);
return “main.jsp”;
}
  1. restful传值方式(重要)
    7.1 简化jsp中参数编写格式
    7.2 在jsp中设置特定的格式
跳转
  1. 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”;
}

四. 跳转方式

  1. 默认跳转方式请求转发
    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包)

  1. 在方法上只有@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中配置


30


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) {
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

  1. 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();
}
}


四. 文件上传

  1. 基于apache的commons-fileupload.jar完成文件上传
    2. MultipartResovler作用:
    2.1 把客户端上传的文件流转换成MutipartFile封装类
    2.2 通过Multipart封装类获取到文件流
    3. 表单数据类型分类
    3.1 在
    的enctype属性控制表单类型
    3.2 默认值 application/x-www-form-urlencoded ,普通表单数据(少量文字信息)
    3.3 text/plain 大文字量时,使用类型。邮件,论文
    3.4 multipart/form-data 表单中包含二进制文件内容

    4.实现步骤:
    4.1 导入springmvc包和apache文件上传commons-fileupload和commons-io两个jar
    4.2 编写jsp页面
**
姓名:
文件:


4.3 配置springmvc.xml










/error



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”?>
xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance
xsi:schemaLocation=http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd”>


contextConfigLocation
classpath:applicationContext.xml



org.springframework.web.context.ContextLoaderListener



springmvc
org.springframework.web.servlet.DispatcherServlet

contextConfigLocation
classpath:springmvc.xml

1


springmvc
/



encoding
org.springframework.web.filter.CharacterEncodingFilter

encoding
utf-8



encoding
/*


2.spring配置文件

<?xml version=“1.0” encoding=“UTF-8”?>
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”>








































3.springMVC配置文件

<?xml version=“1.0” encoding=“UTF-8”?>
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”>























/error




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