SpringMVC

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>/*</url-pattern>
  </filter-mapping>

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对象

//数据传输方式三:使用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 "/Jump";//简写版本,因为有视图解析器,所以可以这样写
		return "forward:/WEB-INF/jsp/Jump.jsp";//完整版本,必须这样写,有了forward,视图解析器不会生效
		
	}
	//页面跳转方式一:请求转发(默认是使用请求转发)
	@RequestMapping("/forward01")
	public ModelAndView forward02(){
		ModelAndView mv=new ModelAndView();
		//mv.setViewName("/Jump");//简写版
		mv.setViewName("forward:/WEB-INF/jsp/Jump.jsp");//完整版本,必须这样写,有了forward,视图解析器不会生效
		return mv;
	}

方式二:重定向

//页面跳转方式二:重定向(不能访问WEB-INF下面的资源)
	@RequestMapping("/redirect")
	public String redirect01(){
		return "redirect:/Jump01.jsp";
		
	}
	//页面跳转方式 二:重定向(不能访问WEB-INF下面的资源)
	@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.后台处理
//如果是get请求,执行这个方法
	@RequestMapping(value="/upload",method=RequestMethod.GET)
	public String upload1(){
		System.out.println("这是get请求");
		return "/upload";
	}
	//如果是post请求,执行这个方法
	@SuppressWarnings("resource")
	@RequestMapping(value="/upload",method=RequestMethod.POST)
	public String upload2(String username,HttpServletRequest req,MultipartFile himg) throws Exception{
		//1.获取根路径
		String realPath = req.getServletContext().getRealPath("/");
		//2.获取文件名
		String filname = himg.getOriginalFilename();
		//3.动态随机产生一个新文件名
		//FilenameUtils.getExtension(filname):获取文件名的后缀
		String name=System.currentTimeMillis()+"."+FilenameUtils.getExtension(filname);
		//4.取得新文件路径
		File file = new File(realPath,"upload/"+name);
		//5.获取父文件路径,如果不存在,则创建
		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{
		//1.设置下载附件的mime类型
		resp.setContentType("application/x-msdownload");    
		//2.设置文件名	attachment; 阻止浏览器直接打开
		resp.setHeader("Content-Disposition", "attachment;filename=1572960604913.jpg");
		//3.获取输出流
		ServletOutputStream out = resp.getOutputStream();
		//4.把附件转为输入流
		FileInputStream in = new FileInputStream(new File("H:/eclipsefile2/SpringMVC/WebContent/upload/1572960604913.jpg"));
		//5.文件下载的核心方法
		IOUtils.copy(in, out);
	}

10.SpringMVC的执行流程

1.客户端发送请求,经过核心控制器时,控制器拿到当前访问URI资源。
2.通过URI地匹配HandlerMapping(处理器映射管理对象),判断当前请求用的是基于配置的controller,还是基于注解的controller。
3.执行对应的controller中的方法,在执行方法之前,一般要先进行数据转换、格式化和验证等操作。
4.在执行完方法之后,会返回一个模型和视图。
5.视图解析器会对返回的逻辑视图进行拼接,拼接完成之后,携带返回的数据到最终的目标视图中。
6.目标视图把数据解析完成之后,在浏览器进行展示。
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值