######一【SpringMvc知识点】####################################
1.SpringMVC中重要组件
2.Spring容器(父)和SpringMVC容器(子)的关系
3.SpringMVC 注解方式环境搭建
4.字符编码过滤器
5.传参:
基本数据类型参数(必须传参、默认值、参名不同)、
参数是对象类型、
相同名传多个值、
传对象.属性、
传集合、
restful
6.跳转方式[默认跳转方式请求转发]
7.视图解析器
8.@ResponseBody
9.SpringMVC作用域传值的几种方式
10.文件下载和上传
11.自定义拦截器
12.拦截器栈
13.springMvc运行原理
######一【SpringMvc知识点详解】####################################
1.SpringMVC中重要组件
①DispatcherServlet :
前端控制器,接收所请求(如果配置/不包含jsp)
②HandlerMapping:
解析请求格式的.判断希望要执行哪个具体的方法.
③HandlerAdapter:
负责调用具体的方法.
④ViewResovler:
视图解析器.解析结果,准备跳转到具体的物理视图
2.Spring 容器和SpringMVC容器的关系
Spring 容器和SpringMVC 容器是父子容器:
3.SpringMVC 注解方式环境搭建
①导入jar包
②在web.xml中配置前端控制器DispatcherServlet
jqk
org.springframework.web.servlet.DispatcherServlet
contextConfigLocation
classpath:springmvc.xml
1
jqk
/
③在src下新建springmvc.xml[引入xmlns:mvc 命名空间]
<?xml version="1.0" encoding="UTF-8"?>
<context:component-scan base-package=“com.bjsxt.controller”></context:component-scan>
mvc:annotation-driven</mvc:annotation-driven>
<mvc:resources location="/js/" mapping="/js/"></mvc:resources>
<mvc:resources location="/css/" mapping="/css/"></mvc:resources>
<mvc:resources location="/images/“mapping=”/images/**"></mvc:resources>
④编写控制器
@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”;
}
}
4.字符编码过滤器
在web.xml中配置Filter:
5.传参
传参说明:
把内容写到方法(HandlerMethod)参数中,SpringMVC只要这个内容,注入内容.
①基本数据类型参数
public class DemoController {
@RequestMapping(“demo”)
public String demo(String name,int age){
System.out.println(“执行demo”+" “+name+”"+age);
return “main.jsp”;
}
}
②如果请求参数名和方法参数名不对应使用@RequestParam()赋值
@RequestMapping(“demo”)
public String demo(@RequestParam(value=“name1”)String name,@RequestParam(value=“age1”)int age){
System.out.println(“执行demo”+" “+name+”"+age);
return “main.jsp”;
}
③如果方法参数是基本数据类型(不是封装类) 可以通过@RequestParam 设置默认值.
@RequestMapping(“page”)
public String page(@RequestParam(defaultValue=“2”)int pageSize,@RequestParam(defaultValue=“1”) int pageNumber){
System.out.println(pageSize+" "+pageNumber);
return “main.jsp”;
}
④如果强制要求必须某个参数
@RequestMapping(“demo2”)
public String demo2(@RequestParam(required=true)String name){
System.out.println(“name 是SQL 的查询条件,必须要传递name 参数”+name);
return “main.jsp”;
}
⑤HandlerMethod中参数是对象类型
@RequestMapping(“demo4”)
public String demo4(People peo){
return “main.jsp”;
}
⑥请求参数中包含多个同名参数的获取方式
复框传递的参数就是多个同名参数:
@RequestMapping(“demo5”)
public String demo5(String name,int age,@RequestParam(“hover”)List abc){
System.out.println(name+" “+age+” "+abc);
return “main.jsp”;
}
⑦请求参数中对象.属性格式
jsp代码:
java代码:
public class Demo {private People peo; get/set方法;}
-------------------------------
@RequestMapping(“demo6”)
public String demo6(Demo demo){
System.out.println(demo);
return “main.jsp”;
}
⑧在请求参数中传递集合对象类型参数
jsp代码:
java代码:
public class Demo {private List peo; get/set方法;}
@RequestMapping(“demo6”)
public String demo6(Demo demo){
System.out.println(demo);
return “main.jsp”;
}
⑨restful传值方式.
jsp代码:
跳转
java代码:-
@RequestMapping(“demo8/{id1}/{name}”)
public String demo8(@PathVariable String name,@PathVariable(“id1”) int age){
System.out.println(name +" "+age);
return “/main.jsp”;
}
6.跳转方式[默认跳转方式请求转发]
请求转发:[添加forward:资源路径或省略forward:转发]
@RequestMapping(“demo6”)
public String demo6(Demo demo){return “forward:/main.jsp”;}
重定向:[添加redirect:资源路径重定向]
@RequestMapping(“demo6”)
public String demo6(Demo demo){return “redirect:/main.jsp”;}
7.视图解析器
①SpringMVC会提供默认视图解析器.
②程序员自定义视图解析器
在springMvc全局配置xml文件中添加:
③如果希望不执行自定义视图解析器, 在方法返回值前面添加forward:或redirect:
8.@ResponseBody
①在方法上只@RequestMapping 时,无论方法返回值是什么认为需要跳转
②在方法上添加@ResponseBody(恒不跳转)
如果返回值满足key-value 形式(对象或map)
把响应头设置为application/json;charset=utf-8
把转换后的内容输出流的形式响应给客户端.
@RequestMapping(value=“demo12”)
@ResponseBody
public People demo12() throws IOException{
People p = new People();
p.setAge(12);
p.setName(“张”);
//返回json字符串
//底层使用Jackson 进行json 转换,在项目中一定要导入jackson 的jar。
//spring4.1.6 对jackson 不支持较高版本,jackson 2.7 无效.
return p;
}
如果返回值不满足key-value,例如返回值为String
@RequestMapping(value=“demo12”,produces=“text/html;charset=utf-8”)
@ResponseBody
public String demo12() throws IOException{
People p = new People();
p.setAge(12);
p.setName(“张”);
//把相应头设置为text/html,并把方法返回值以流的形式直接输出。
//如果返回值包含中文,出现中文乱码。
//produces 表示响应头中Content-Type取值。
return “中文”;
}
9.SpringMVC作用域传值的几种方式
①使用原生Servlet
在HanlderMethod(控制器中方法)参数中添加作用域对象:
@RequestMapping(“demo1”)
public String demo1(HttpServletRequest abc,HttpSession sessionParam){
//request 作用域
abc.setAttribute(“req”, “req 的值”);
//session 作用域
HttpSession session = abc.getSession();
session.setAttribute(“session”, “session 的值”);
sessionParam.setAttribute(“sessionParam”,“sessionParam 的值”);
//appliaction 作用域
ServletContext application =abc.getServletContext();
application.setAttribute(“application”,“application 的值”);
return “/index.jsp”;
}
②使用Map集合
把map中内容放在request作用域中
spring 会对map 集合通过BindingAwareModelMap进行实例化
@RequestMapping(“demo2”)
public String demo2(Map<String,Object> map){
map.put(“map”,“map 的值”);
return “/index.jsp”;
}
③使用SpringMVC中Model接口
把内容最终放入到request作用域中.
@RequestMapping(“demo3”)
public String demo3(Model model){
model.addAttribute(“model”, “model 的值”);
return “/index.jsp”;
}
④使用SpringMVC中ModelAndView类
@RequestMapping(“demo4”)
public ModelAndView demo4(){
//参数,跳转视图
ModelAndView mav = new ModelAndView("/index.jsp");
//把内容放入到request作用域中
mav.addObject(“mav”, “mav的值”);
return mav;
}
10.文件下载和上传
①文件下载
说明:
访问资源时相应头如果没设置Content-Disposition,浏览器默认照inline值进行处理
只需要修改相应头中Context-Disposition=”attachment;filename=文件名”
实现步骤:
导入apatch的两个jar
在jsp中添加超链接,设置要下载文件
<a href="download?fileName=a.rar">下载</a>
编写控制器
@RequestMapping("download")
public void download(String fileName,HttpServletResponse res,HttpServletRequest req) throws IOException{
//设置响应流中文件进行下载
res.setHeader("Content-Disposition","attachment;filename="+fileName);
//把二进制流放入到响应体中.
ServletOutputStream os = res.getOutputStream();
String path =req.getServletContext().getRealPath("files");
System.out.println(path);
File file = new File(path, fileName);
byte[] bytes = FileUtils.readFileToByteArray(file);
os.write(bytes);
os.flush();
os.close();
}
②文件上传[基于apache的commons-fileupload.jar完成文件上传]
(1)MultipartResovler作用:
把客户端上传的文件流转换成MutipartFile封装类.
通过MutipartFile 封装类获取到文件流
(2)表单数据类型分类[在的enctype 属性控制表单类型]:
默认值application/x-www-form-urlencoded,普通表单数据.(少量文字信息)
text/plain 大文字量时使用的类型.邮件,论文
multipart/form-data 表单中包含二进制文件内容.
(3)实现步骤:
a.导入springmvc包和apache文件上传commons-fileupload和commons-io两个jar
b.编写JSP页面:
姓名:
文件:
c.配置springmvc.xml:
/error.jsp
d.编写控制器类:
//MultipartFile对象名必须和的name属性值相同
@RequestMapping(“upload”)
public String upload(MultipartFile file,String name)throws IOException{
String fileName = file.getOriginalFilename();
String suffix =fileName.substring(fileName.lastIndexOf("."));
//判断上传文件类型
if(suffix.equalsIgnoreCase(".png")){
String uuid = UUID.randomUUID().toString();
FileUtils.copyInputStreamToFile(file.getInputStream(), new File(“E:/”+uuid+suffix));
return “/index.jsp”;
}else{
return “error.jsp”;
}
}
11.自定义拦截器
①SpringMVC拦截器和Filter的区别
拦截器只能拦截器Controller,Filter可以拦截任何请求.
②实现自定义拦截器的步骤:
(1)新建类实现HandlerInterceptor:
public class DemoInterceptor implements HandlerInterceptor {
//在进入控制器之前执行,如果返回值为false,阻止进入控制器。控制代码。
@Override
public boolean preHandle(HttpServletRequest arg0,HttpServletResponse arg1, Object arg2) throws Exception{
System.out.println(“arg2:”+arg2);
System.out.println(“preHandle”);
return true;
}
//控制器执行完成,进入到jsp之前执行。日志记录。敏感词语过滤。
@Override
public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3)throws Exception {
System.out.println(“往”+arg3.getViewName()+“跳转”);
System.out.println(“model 的值”+arg3.getModel().get(“model”));
String word =arg3.getModel().get(“model”).toString();
String newWord = word.replace(“祖国”, “**”);
arg3.getModel().put(“model”, newWord);
System.out.println(“postHandle”);
}
//jsp 执行完成后执行。记录执行过程中出现的异常.可以把异常记录到日志中。
@Override
public void afterCompletion(HttpServletRequest arg0,HttpServletResponse arg1, Object arg2, Exception arg3)throws Exception {
System.out.println(“afterCompletion”+arg3.getMessage());
}
}
(2)在springmvc.xml配置拦截器需要拦截哪些控制器:
a.拦截所有控制器:
<mvc:interceptors>
<bean class="com.bjsxt.interceptor.DemoInterceptor"></bean>
</mvc:interceptors>
b.拦截指定控制器:
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/demo"/>
<mvc:mapping path="/demo1"/>
<bean class="com.bjsxt.interceptor.DemoInterceptor"></bean>
</mvc:interceptor>
</mvc:interceptors>
12.拦截器栈
a.多个拦截器同时生效时,组成了拦截器栈.
b.顺序:先进后出.[执行顺序和在springmvc.xml 中配置顺序关]
13.springMvc运行原理
(1)springMvc运行原理:
如果在web.xml 中设置DispatcherServlet 的为/时,
当用户发起请求, 请求一个控制器, 首先会执行DispatcherServlet.
由DispatcherServlet 调用HandlerMapping 的DefaultAnnotationHandlerMapping解析URL,
解析后调用HandlerAdatper 组件的AnnotationMethodHandlerAdapter 调用Controller 中的HandlerMethod.
当HandlerMethod 执行完成后会返回View,会被ViewResovler 进行视图解析,
解析后调用jsp 对应的.class 文件并运行,最终把运行.class 文件的结果响应给客户端.
14.SpringMVC对Date类型转换
1.在springmvc.xml 中配置,代码中不需要做任何修改
1.1 必须额外导入joda-time.jar
1.2 时间类型java.sql.Date
<mvc:annotation-driven conversion-service=“conversionService”></mvc:annotation-driven>
<bean id="conversionService"class=“org.springframework.format.support.FormattingConversionServiceFactoryBean”>
2.使用注解.在需要转换的参数或实体类属性上添加@DateTimeFormatter(pattern=”表达式”)
2.1 使用Date 参数接收
@RequestMapping(“demo”)
public String demo(@DateTimeFormat(pattern=“yyyy-MM-dd”) Date time){
System.out.println(time);
return “abc.jsp”;
}
2.2 在实体类中
@RequestMapping(“demo”)
public String demo( Demo1 demo){
System.out.println(demo);
return “abc.jsp”;
}
public class Demo1 {
@DateTimeFormat(pattern=“yyyy/MM/dd”)
private Date time;
}
2.3 注意地方: 不需要导入额外jar . Date 是java.util.Date.