SpringMVC
用于做请求的响应和处理
之前封装的Dispacher
接受请求
寻找资源 类 方法
处理 参数 响应
Servlet没有耦合
使用配置文件
1.导包(beans context core expression aop web webmvc)
2.主配置(本质是一个servlet)
web.xml 中 配置入口
DispacherServlet 所有控制层统一接收 并分发(谁)
*.do
3.小配置 请求--真实类(方法) 对应关系
文件默认是在web-inf文件夹下找的
文件默认名字是 标签名 - servlet.xml
如果想修改文件路径和名字
在步骤2的xml文件里进行修改 init-param
contextConfigLocation
classPath:xxx.xml
4.浏览器发请求 找到真实类
5.请求参数 真实类方法中写参数变量就行--参数的IOC和DI
普通类型 String int map类型 domain类型
6.响应信息
注解开发
1.导包(beans context core expression aop web webmvc)
2.主配置(本质是一个servlet)
web.xml 中 配置入口
DispacherServlet 所有控制层统一接收 并分发(谁)
*.do
3.小配置 请求--真实类(方法) 对应关系
文件默认是在web-inf文件夹下找的
文件默认名字是 标签名 - servlet.xml
如果想修改文件路径和名字
在步骤2的xml文件里进行修改 init-param
contextConfigLocation
classPath:xxx.xml
加载了HandlerMapping
4.自己写controller
没有继承或实现关系
方法可以随便写
参数可以随便传 返回值 void String ModelAndView
5.自己写的controller加注解
@Controller ---> Spring将对象管理起来
@RequestMapping ---> SpringMVC请求和对应资源连接起来
发送请求
1.如何发送
#方式一:发送时直接写 类名.do
在类上面写注解@RequestMapping(path|value="类名.do")
类中只有一个方法 方法上面添加注解RequestMapping
#方式二:发送请求时候 类名字.do?method=方法名
类名上写注解(类名.do)
方法上写注解(params={""})
(请求结构就比较麻烦 类名.do?method=方法名)
(类的注解也很麻烦 类上一个 方法上有一个 方法的这个注解还有params参数)
方法三:发送请求的时候 xxx.do (xxx通常是一个方法名)
类上面就不用写注解了
类中的方法上面写注解 注解中写与请求对应那个 xxx.do
2.@RequestMapping注解中的方法
path{"",""}
value = {"",""} //同上面 有时多个请求一个方法
params = {"",""}
method = {RequestMethod.GET}
headers = {"Accept-Language",""}
接收参数
1.方法中直接传入变量
变量直接接收 要求变量名字看i与前面传递的key一致
即使是一个变量也需要对应key一致 否则接收不到
如果变量和前面传递的key不一致,可以利用注解@RequestParam("key")
参数的类型可以不一定是string,int等也可以
2.方法中直接传入实体对象
如果传递的参数可以组合成一个对象
可以直接使用对象接收
对象中的属性名和前面传递的key一致
如果对象里面还有对象
只需要在请求的时候写 对象的属性.属性名即可
计入User中有一个Wallet对象 Wallet中有个money属性
walet.money
3.方法中传入map集合的方式
可以使用Map类型来接收请求的参数的
前提是 Map参数的前面 必须添加@RequestParam
否则Map是无法接收到参数的
Model ModelMap ModelAndView
4.方法中传递原生Request对象
直接在方法中传递参数变量即可接收
HttpServletRequest
HttpServletResponse
-------
中文 自定义转换器
接收请求参数的时候
产生的中文乱码问题(get没问题 post请求 配置一个Filter)
可以利用SpringMVC给我们提供的一个小过滤器处理
自定义转换器
Converter
1.自定义一个类
2.实现上面这个接口
接口支持泛型 Converter
3.重写接口中的转换方法
方法内部该做具体转化的事情
方法会返回一个转化后的对象
4.告知Spring这里有一个自定义的类型转换器
需要让Spring帮我们加载并管理起来
配置
配置驱动
------------
接收请求参数的时候
@RequestParam注解 变量 Map
@RequestHeader注解 接受协议头数据
@CookieValue
@RequestBody 接收 key=value&key=value 放在参数前面
注解只能接收Post请求方式 post请求是存在协议体(参数)
get请求只有请求头没有请求体
@ResponseBody注解 json响应
@ModelAttribute注解
放在某一个方法上面
方法在请求的方法执行之前限制性的(块 init)
响应处理
void
自己写响应
原生response.getWriter().write();
string
转发 forward:xxx.jsp
重定向 redirect:xxx.jsp
Json处理
现在开发项目都是前后端分离
JSP(编译过程,性能不好) 静态数据+动态数据 一次请求 一次拼接 一次响应
静态数据先响应 动态数据发送异步请求 而后在浏览器端拼接展示
HTML+AJAX+JSON(js操作)
String 转发路径 Ajax请求直接响应
MAP domain->Ajax响应-Json
总结
响应信息方式如下
Object Domain String Map List----->Json
1.处理工具--jar 如jackson等包
2.告知框架方法的返回值需要解释 @Responsebody
ModelAndView
一些是这种方式开发的
服务端业务层可能会产生一些数据
这些数据我们需要存入作用域中带走
request.setAttribute();
1.可以使用原生Map处理
Map接受请求参数(@RequestParam)
Map可以返回数据(@ResponseBody)
2.可以使用Model或ModelMap处理
Model底层继承ModelMap
存储数据之前不需要自己创建
只需将变量放置在方法的参数里即可 框架会帮我们自动注入
m.addAttribute("",object);
3.可使使用ModelAndView处理
不能放在方法的参数里 框架不会帮我们注入
需要用的时候自己new即可
mv.addObject("",object);
mv.setViewName("xxx.jsp");
可以包含数据和转发路径
需要见自己创建的mv对象返回
4.如果想要将值从session等中返回
涉及到Session的存储 类上面添加@SessionAttributes({"",""})
异常处理
JSP <%%> EL+JSTL 异常页
异常的处理
1.自定义一个异常类MyException 将所有的异常都统一捕获 变成一个唯一的常量 交给总管
2.自定义一个异常处理类(处理异常 做转发 响应) ExceptionResolver(核心)
实现规则
实现接口HandlerExceptionResolver
重写方法public ModelAndView resolveException(request,response,object,exception){
判断一下exception对象是否是我们自己抛出
创建ModelAndView对象 存储信息 转发路径 error.jsp
return mv;
}
3.告知Spring将我们自己定义的处理类管理起来(配置文件 xml 注解)
自己定义的处理类上面添加@Component注解(别忘了扫描包)
拦截器
原生Tomcat时候
Servlet---资源类
JSP(Java Server Pages)---本质就是Servlet
帮助Servlet服务的 响应拼接 静态资源+动态数据
静态动态分离 HTML+AJAX+JSON
Filter---过滤器 特殊的Servlet
责任链设计模式
动态代理机制---AOP设计思想
SpringMVC的拦截器可以理解为是以前的Filter
在真正到达资源换(Controller---Servlet)之前做事情的
SpringAOP---自己定义类和方法---交给Spring帮我们管理
拦截器使用流程
1.自己定义一个拦截器的类(规则)
继承HandlerInterceptorAdapter
实现HandlerInterceptor(接口中三个方法都是default修饰)
2.自定义类的方法需要重写
preHandle 预先处理(controller之前) AOP前置
postHandle 请求后处理(controller之后) AOP后置
afterHandle 完成后处理(controller执行完毕之后)
3.配置ApplicationContext.xml文件
过滤器Filter 拦截器Interceptor
Tomcat容器提供的 SpringMVC框架提供的
没有框架的时候可以 必须有框架支持
配置web.xml Spring核心文件ApplicationContext.xml
处理所有请求 处理Servlet请求
文件上传/下载
上传
依赖于Apache两个jar
commons-io
commons-fileupload
1.导包 commons-io、fileupload
2.DiskFileItemFactory ServletFileUpload upload.parseRequest
得factory 得upload 得itemList
3.List
4.判断是否为表单 item.isFormField()
item.getFieldName
item.getString("UTF-8")
5.文件对象
item.getName()
item.write(new File("上传路径"))
基于SpringMVC的方式
1.导包
2.配置一个文件解析器 CommonsMultipartResolver
2.自己写一个Controller
方法内部像之前一样接收参数即可 直接变量接收
文件参数MultipartFile类型 变量名与前面的key一直
String text
MultipartFile upload
3.获取文件名字 文件内容 传输
upload.getOriginalFilename();
upload.transferTo(new File("上传路径"))
下载
原生
1.获取请求过来的文件名
request.getParameter(filename);
2.直接创建文件输入流读取文件
InputStream is = new FileInputStream("src"+filename);
3.做响应--设置
文件名含中文
fileName = URLEncoder.encode(fileName,"UTF-8");
响应头
response.setContentType("application/x-msdownload");
response.setHeader("Content-disposition","attachment;filename="+fileName);
4.正式开始写数据(输出流)
OutputStream os = response.getOutputStream();
byte[] b = new byte[1024];
//读取有效字节个数
int length = is.read(b);
while(length!=-1){
os.write(b,0);
os.flush();
length = is.read(b);
}
SpringMVC
public ResponseEntity xxx(String fileName) throws Exception
1.直接获取读取文件
File file = new File(src+fileName);
2.设置响应信息相关 有中文就处理
fileName = new String(fileName.getBytes("UTF-8"),"iso-8859-1");
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
headers.setContentDispositionFormData("attachment",fileName)
3.将响应信息存入一个返回值对象内即可---ResponseEntity
byte[] b = FileUtils.readFileToByteArray(file);
return new ResponseEntity(b,headers,HttpStatus.CREATED);

浙公网安备 33010602011771号