SpringMVC,RET风格,拦截器,文件上传下载

MVC:
M即数据模型,servcie层,dao层返回的数据结构,一般是一个实体类;
C即接收请求,controller层,将请求派发给M,处理后把返回的模型数据返回给视图V;
V即数据可视化,一些界面,图,可以是JSP或Html;

SpringMVC入门:
web.xml配置

 <!-- springmvc入口 -->
    <servlet>
        <servlet-name>springmvc</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <!-- 指定springmvc配置文件路径 -->
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:spring/springmvc-servlet.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>springmvc</servlet-name>
        <!-- /表示拦截除了jsp以外的所有请求 -->
        <url-pattern>/</url-pattern>
    </servlet-mapping>

springmvc-servlet.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       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">
    <!-- 开启注解扫描,扫描controller包 -->
    <context:component-scan base-package="com.kk.controller"></context:component-scan>
    <!-- mvc注解驱动 会自动注册消息转换器-->
    <mvc:annotation-driven></mvc:annotation-driven>
    <!-- 配置视图解析器 -->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/jsp/"></property>
        <property name="suffix" value=".jsp"></property>
    </bean>
    <!--解除对静态文件的拦截 -->
    <mvc:default-servlet-handler/>
</beans>

标准URL映射
语法:@RequestMapping(value=”xxx”)
可以定义在Controller类上,也可以定义在Controller类中的方法上。
如果Controller类上和方法上都加了@RequestMapping,那么该请求路径就是:类上的@RequestMapping的value+方法上的@RequestMapping的value;如果value不以/开头,springmvc会自动加上。
Controller类上的@RequestMapping可以省略,此时请求路径就是:方法上的@RequestMapping的value

@RequestMapping(value=””,params=””)
params=”id” : 请求参数中必须有id
params=”!id” : 请求参数中不能包含id
params=”id=1” : 请求参数中id的值必须为1
params=”id!=1” : 请求参数中id的值必须不能等于1
params={“id”,”name”} : 请求参数中必须包含id和name两个参数

Rest风格的url请求
@GetMapping:相当于@RequestMapping(method=RequestMethod.GET)
@PostMapping
@PutMapping
@DeleteMapping

转发:”forward:/user/list” 重定向:”redirect:/hello/list”
区别:
转发
浏览器发出一次请求,获取一次响应
浏览器地址栏未发生变化,仍是第1次发出的请求
重定向:浏览器发出2次请求,获取2次请求
浏览器地址栏发生变化,仍是第2次发出的请求

@ResponseBody
表示该方法需要输出其它视图(json、xml),springmvc默认通过json转化器转化输出

代码,通配符占位符的应用

@Controller
public class UserController {
    @Autowired
    private UserService userService;
    /**
     * 查询所有用户数据
     * @return
     */
    @GetMapping("list")
    public String list(Model model){
        List<User> list = userService.findAllUsers();
        model.addAttribute("users", list);
        return "users";
    }
     @RequestMapping("list?")
     //对应的路径user/list+任意一个字符 例 1
    public String list(Model model){
        List<User> list = userService.findAllUsers();
        model.addAttribute("users", list);
        return "users";
    }
       @RequestMapping("list*")
       //对应的路径user/list+任意多个字符 例 123
    public String list(Model model){
        List<User> list = userService.findAllUsers();
        model.addAttribute("users", list);
        return "users";
    }
       @RequestMapping("**/list?")
       //对应的路径user/+多个路径+list 例user/aa/bb/list
    public String list(Model model){
        List<User> list = userService.findAllUsers();
        model.addAttribute("users", list);
        return "users";
    }
/**
 * 占位符映射
 */
 @PutMapping("save/{name}")
    public void save(User user, @PathVariable("name")String name){
        user.setName(name);
        userService.saveUser2(user);
        
    }
   //带参数,Servlet,save?lixxx
  @RequestMapping("save")
    public String  save(User user, @RequestParam("name")String name, HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse){
        user.setName(name);
        userService.saveUser2(user);
        return "redirect:/list";
    }
   // 获取cookie
@RequestMapping("show")
    @ResponseBody
    public String test25(@CookieValue("JSESSIONID")String jsessionid){
        return jsessionid;
        //745F1F1E8E69980B055B1A5580EAAFB4
    }

文件上传
springmvc文件上传底层使用的还是apache的文件上传组件
前端表单要求:method设为POST,enctype设为multipart/form-data,这样才会以二进制数据流发送给服务器

标签的 enctype属性
在这里插入图片描述

1 引入依赖

<dependency>
			<groupId>commons-fileupload</groupId>
			<artifactId>commons-fileupload</artifactId>
			<version>1.3.1</version>
</dependency>

**2 配置文件配置文件上传解析器**
<!-- 配置文件上传解析器 -->
        <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
        	<!-- 上传文件的总大小不能超过10M -->
        	<property name="maxUploadSize" value="10485760"></property>
        	<!-- 设置默认编码 -->
        	<property name="defaultEncoding" value="UTF-8"></property>
        </bean>

3 controller写请求

/**
	 * @RequestParam("file")表示接收文件参数,类型是MultipartFile
	 * @return
	 * @throws IllegalStateException
	 * @throws IOException
	 */
	@RequestMapping("upload")
	public String upload(@RequestParam("file")MultipartFile file) throws IllegalStateException, IOException{
		if(file != null){
			//复制文件到某个目录
			file.transferTo(new File("C:\\upload\\" + file.getOriginalFilename()));
		}
		return "redirect:/success.html";
	}

结果
在这里插入图片描述

文件下载:
controller层:
一:使用HttpServletResponse

 @GetMapping("/downloadLocalFile")
    public void downloadLocalFileInWebContent(@RequestParam("path") String path,
                                                                HttpServletRequest request, HttpServletResponse response) {
        String realPath = request.getSession().getServletContext().getRealPath(path);
        File file = new File(realPath);
        if (file == null || !file.exists()) {
            return;
        }
        OutputStream out = null;
        try {
            response.reset();
            response.setContentType("application/octet-stream; charset=utf-8");
            response.setHeader("Content-Disposition", "attachment; filename=" + file.getName());
/**
如果要下载到指定路径,可以创建一个指定路径的out
File file = new File("C:/kk/" + file.getName());
FileOutputStream out = new FileOutputStream(file);
**/
            out = response.getOutputStream();
            out.write(FileUtils.readFileToByteArray(file));
            out.flush();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (out != null) {
                try {
                    out.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

二:使用spring自带的,不通过HttpServletResponse

@GetMapping("/downloadLocalFile")
    public ResponseEntity<byte[]> downloadLocalFileInWebContent(@RequestParam("path") String path) {
        String realPath = request.getSession().getServletContext().getRealPath(path);
        File file = new File(realPath);
        String fileName = file.getName();
        String dfileName = new String(fileName.getBytes("gb2312"), "iso8859-1");
        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
        headers.setContentDispositionFormData("attachment", dfileName);
        return new ResponseEntity<byte[]>(FileUtils.readFileToByteArray(file), headers, HttpStatus.CREATED);
    }

自定义拦截器
应用场景:性能监控、登陆验证
1 写自定义拦截器类 implements HandlerInterceptor

public class MyInterceptor implements HandlerInterceptor {
    /**
     * 前置方法,在Handler执行方法之前执行
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
            throws Exception {
        System.out.println("preHandle...");
        return true;
    }

    /**
     * 后置方法,在Handler执行方法之后执行
     */
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
                           ModelAndView modelAndView) throws Exception {
        System.out.println("postHandle...");
    }

    /**
     * 完成方法,在视图渲染完成之后执行
     */
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
            throws Exception {
        System.out.println("afterCompletion...");
    }

}

配置类中配置自定义拦截器

 <!-- 配置自定义拦截器 -->
    <mvc:interceptors>
        <mvc:interceptor>
            <!-- 拦截所有controller请求,包括多级路径也能被拦截
               例如:/hello.do    /hello/show1.do都能被拦截 -->
            <mvc:mapping path="/**"/>
            <!-- 自定义拦截器的全路径名 -->
            <bean class="com.kk.interceptor.MyInterceptor"></bean>
        </mvc:interceptor>
    </mvc:interceptors>

这样所有请求都会执行自定义拦截器的方法

拦截器可以创建多个,顺序也挺有意思,情况很多不深入了;
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值