1.什么是SpringMVC?
springmvc就是一款mvc型框架
m:指的是model模型 例如:damian/service/dao/工具类。主要功能是准备数据、操作数据
v:指的是view视图,例如jsp/html......。主要是展示数据。
c:指的是controller(控制器),例如controller/servlet.........。主要是接收参数、调用业务和控制页面跳转。
springmvc是spring的一个子项目。
有了servlet之后,为什么我们还要学习springmvc呢?
因为servlet太难用了(接收参数,上传下载、页面跳转都很麻烦)springmvc和spring无缝集成。
2.SpringMVC的实现步骤
1.导入相关jar包
2.编写springmvc的配置文件
3.创建一个类实现springmvc提供的接口或者抽象类
4.在核心配置文件中提供该控制器的资源
5.编写springmvc的核心控制器
6.测试
3.什么是resetful?
resetful是一个架构风格,不是一个标准。
4.controller的实现方式
(1)方式一:实现controller接口
(2)方式二:实现HttpRequestHandler接口(与servlet用法一样)
(3)方式三:使用普通类和注解(推荐)
@Controller
public class Hello03Controller {
@RequestMapping("/hello")
public ModelAndView Hello03(){
ModelAndView mv=new ModelAndView();
mv.addObject("mn","今天是阴天");
mv.setViewName("/Hello03.jsp");
return mv;
}
}
5.接收参数的方式
方式一:接收普通参数
方式二:以对象的方式接收
方式三:使用servlet的取值方式
方式四:
使用resetful风格传值(在url地址栏中取值)
@RequestMapping("/04/{id333}/{name}")
public void param04(@PathVariable("id333")Long sdlkfjsadkghsda,@PathVariable("name")String name){
System.out.println(sdlkfjsadkghsda);
System.out.println(name);
}
方式五:
当前台传递的key值和后台接收参数的名不一致的解决方案
@RequestMapping("/05")
public void param05(@RequestParam("sname")String name){
System.out.println(name);
}
6.post解决中文乱码问题
<!-- springmvc提供的专门解决post提交乱码问题的过滤器 -->
<filter>
<filter-name>CharacterEncodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<!-- 当前系统应该以UTF-8编码为准 -->
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<init-param>
<!-- 强制性以当前过滤器编码为准 -->
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CharacterEncodingFilter</filter-name>
<url-pattern>
7.数据传输方式
方式一:使用model
@RequestMapping("/trans01")
public String dateTrans01(Model model){
model.addAttribute("date","数据传输方式一");
model.addAttribute("student",new Student(1L,"杨过",20));
return "/transView";
}
方式二:使用ModelAndView
@RequestMapping("/trans02")
public ModelAndView dateTrans02(){
ModelAndView mv=new ModelAndView();
mv.addObject("date","数据传输方式二");
mv.addObject("student",new Student(2L,"小龙女",20));
mv.setViewName("/transView");
return mv;
}
方式三:使用request对象
@RequestMapping("/trans03")
public String dateTrans03(HttpServletRequest req){
req.setAttribute("date","数据传输方式三");
req.setAttribute("student",new Student(2L,"小龙女",20));
return "/transView";
}
8.页面跳转方式
页面与页面的跳转一共有2种方式:
1.请求转发
1.1 url地址栏不会发生改变
1.2 不能跨域访问
1.3 它能访问WEB-INF下面的资源
1.4 多个页面能共享同一个请求数据
1.5 只会发送1次请求
2.重定向
2.1 url地址栏会发生改变
2.2 可以跨域访问
2.3 不能访问WEB-INF下面的资源
2.4 多个页面不能共享同一个请求数据
2.5 会发送多次请求
方式一:请求转发
@RequestMapping("/forward")
public String forward01(){
return "forward:/WEB-INF/jsp/Jump.jsp";
}
@RequestMapping("/forward01")
public ModelAndView forward02(){
ModelAndView mv=new ModelAndView();
mv.setViewName("forward:/WEB-INF/jsp/Jump.jsp");
return mv;
}
方式二:重定向
@RequestMapping("/redirect")
public String redirect01(){
return "redirect:/Jump01.jsp";
}
@RequestMapping("/redirect01")
public ModelAndView redirect02(){
ModelAndView mv=new ModelAndView();
mv.setViewName("redirect:/Jump01.jsp");
return mv;
}
9.文件的上传与下载
(1)文件上传
1.添加jar包
2.配置视图解析器
<!-- 上传文件必须配置上传解析器 -->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!-- 允许上传附件最大40MB -->
<property name="maxUploadSize" value="41943040"/>
</bean>
3.后台处理
@RequestMapping(value="/upload",method=RequestMethod.GET)
public String upload1(){
System.out.println("这是get请求");
return "/upload";
}
@SuppressWarnings("resource")
@RequestMapping(value="/upload",method=RequestMethod.POST)
public String upload2(String username,HttpServletRequest req,MultipartFile himg) throws Exception{
String realPath = req.getServletContext().getRealPath("/");
String filname = himg.getOriginalFilename();
String name=System.currentTimeMillis()+"."+FilenameUtils.getExtension(filname);
File file = new File(realPath,"upload/"+name);
if(!file.getParentFile().exists()){
file.getParentFile().mkdirs();
}
FileOutputStream fileOutputStream = new FileOutputStream(file);
IOUtils.copy(himg.getInputStream(), fileOutputStream);
fileOutputStream.close();
himg.getInputStream().close();
return "forward:/upload.jsp";
}
(2)文件下载
@RequestMapping("/download")
public void download(HttpServletResponse resp) throws Exception{
resp.setContentType("application/x-msdownload");
resp.setHeader("Content-Disposition", "attachment;filename=1572960604913.jpg");
ServletOutputStream out = resp.getOutputStream();
FileInputStream in = new FileInputStream(new File("H:/eclipsefile2/SpringMVC/WebContent/upload/1572960604913.jpg"));
IOUtils.copy(in, out);
}
10.SpringMVC的执行流程
1.客户端发送请求,经过核心控制器时,控制器拿到当前访问URI资源。
2.通过URI地匹配HandlerMapping(处理器映射管理对象),判断当前请求用的是基于配置的controller,还是基于注解的controller。
3.执行对应的controller中的方法,在执行方法之前,一般要先进行数据转换、格式化和验证等操作。
4.在执行完方法之后,会返回一个模型和视图。
5.视图解析器会对返回的逻辑视图进行拼接,拼接完成之后,携带返回的数据到最终的目标视图中。
6.目标视图把数据解析完成之后,在浏览器进行展示。