首页 > 编程语言 > 详细

JavaWeb - SpringMVC (2)

时间:2021-03-06 23:52:40      阅读:25      评论:0      收藏:0      [点我收藏+]

JavaWeb - SpringMVC (2)

1 ajax 异步交互

// Springmvc默认用MappingJackson2HttpMessageConverter对json数据进行转换,需要加入jackson的包;并springmvc核心配置文件开启处理器映射器和处理器适配器增强 <mvc:annotation-driven />

// 导入 json 相关包 jackson-databind, jackson-core, jackson-annotations

<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.8</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.9.8</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.9.0</version>
</dependency>

1.1 @RequestBody 和 @ResponseBody
// @RequestBody 
// 用于controller 方法的形参声明, 当ajax指定contentType为json时,通过HttpMessageConverter接口转换为对应的POJO对象

// @ResponseBody 
// 用于将Controller 方法的返回对象通过HttpMessageConverter接口转换为指定格式(json,xml)并通过response 响应

// 编写JSP 文件引入jquery文件(jquery文件不要放到WEB-INF目录下)并springmvc核心配置文件中开启静态资源访问 

<script src="${pageContext.request.contextPath}/js/jquery-3.5.1.js"></script> // 引入jquery

    <button id="btn1">ajax异步提交</button>
    <script>
        $("#btn1").click(function () {
            let url = ‘${pageContext.request.contextPath}/ajaxRequest‘;
            let data = ‘[{"id":1,"username":"张飞"},{"id":2,"username":"刘备"}]‘;
            $.ajax({
                type : ‘POST‘,
                url : url,
                data : data,
                contentType : ‘application/json;charset=utf-8‘, // 设置contentType
                success: function (resp) {
                    alert(JSON.stringify(resp)) //解析响应内容
                }
            })
        })
    </script>
    
@RequestMapping("/ajaxRequest")
    @ResponseBody //将返回list 集合转换为 Json 串
    public List<User> quick7(@RequestBody List<User> list) {
        System.out.println(list);
        return list;
    }    

2 RESTful

Restful风格的请求是使用“url+请求方式”表示一次请求目的的,,HTTP 协议里面四个表示操作方式的动词如下
	- GET:读取(Read)
	- POST:新建(Create)
	- PUT:更新(Update)
	- DELETE:删除(Delete)
    
    
// @PathVariable   用来接收RESTful风格请求地址中占位符的值
    
// @RestController 替代@Controller和@ResponseBody两个注解    
    
// @Controller
@RestController
public class RestFulController {
    @GetMapping(value = "/user/{id}")
    // 相当于 @RequestMapping(value = "/user/{id}",method = RequestMethod.GET)
    // @ResponseBody
    public String get(@PathVariable Integer id) {
    return "get:" + id;
    }
    @PostMapping(value = "/user")
    // @ResponseBody
    public String post() {
    return "post";
    }
    @PutMapping(value = "/user")
    // @ResponseBody
    public String put() {
    return "put";
    }
    @DeleteMapping(value = "/user/{id}")
    // @ResponseBody
    public String delete(@PathVariable Integer id) {
    return "delete:"+ id;
    }
}    

3 文件上传

// 3 要素
	- 表单项 type="file"
    - 表单的提交方式 method="POST"
	- 表单的enctype属性是多部分表单形式 enctype=“multipart/form-data"

// 添加文件上传 包 commons-fileupload, commons-io
        
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.3</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.6</version>
</dependency>
        
// 在springmvc核心配置文件中配置文件上传解析器   
        <!--文件上传解析器-->
<bean id="multipartResolver"
class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!-- 设定文件上传的最大值为5MB,5*1024*1024 -->
<property name="maxUploadSize" value="5242880"></property>
<!-- 设定文件上传时写入内存的最大值,如果小于这个参数不会生成临时文件,默认为10240 -->
<property name="maxInMemorySize" value="40960"></property>
</bean>
    
// 编写JSP form表单,遵循3要素 
    <form action="${pageContext.request.contextPath}/fileUpload" method="post"
enctype="multipart/form-data">
名称:<input type="text" name="username"> <br>
文件:<input type="file" name="filePic"> <br>
<input type="submit" value="单文件上传">
</form>

// 单文件上传 MultipartFile接收表单中file,名称相同
@RequestMapping("/upload")
    public String quick8(String author, MultipartFile uploadFile) throws IOException {
        System.out.println(author);
        String filename = uploadFile.getOriginalFilename(); // 获取原文件名称
        uploadFile.transferTo(new File("D:/upload/"+filename)); // 将上传文件写入目标地址
        return "/WEB-INF/pages/success.jsp";
    }    

// 多文件上传
// JSP 重复相同名称的file input框
<input type="file" name="uploadFiles"><br>
        <input type="file" name="uploadFiles"><br>
    
// 使用MultipartFile数组接收 并依次处理上传
@RequestMapping("/uploads")
    public String quick9(String author, MultipartFile[] uploadFiles) throws IOException {
        System.out.println(author);

        for (MultipartFile uploadFile : uploadFiles) {
            String filename = uploadFile.getOriginalFilename();
            uploadFile.transferTo(new File("D:/upload/"+filename));
        }

        return "/WEB-INF/pages/success.jsp";
    }    

// 当form表单修改为多部分表单时,request.getParameter()将失效 (enctype)

//当form表单的enctype取值为 application/x-www-form-urlencoded 时,form表单的正文内容格式是: name=value&name=value

4 异常处理

// 异常处理方式:
	- 捕获异常 (try - catch) 业务代码和异常处理代码耦合
	- 抛出异常 (throws)
        
// 系统 dao, service, controller 都向上抛出异常直到springmvc前端控制器交给异常处理器进行异常处理 HandlerExceptionResolver         
4.1 自定义异常处理器
// 1 自定义异常处理器类 实现HandlerExceptionResolver

public class GlobalExceptionResolver implements HandlerExceptionResolver {

    @Override
    public ModelAndView resolveException(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) { // o 为handler e 为异常信息
        ModelAndView model = new ModelAndView(); 
        model.addObject("error",e); // 在Model对象中设置异常信息并将name设置为error
        model.setViewName("/WEB-INF/pages/error.jsp"); // 设置model 跳转视图
        return model;
    }
}

// 2 配置异常处理器
	// 在自定义类上添加 @Component
	// springmvc 核心配置文件中配置
<bean id="globalExceptionResolver" class="com.lagou.exception.GlobalExceptionResolver"></bean>
    
// 3 异常处理 JSP页面
    <body>
    这是一个异常信息页面
    ${error} // EL表达式获取error信息
	</body>

4.2 web 异常处理机制
// web.xml 中配置,创建对应500.jsp, 404.jsp 
<!--处理500异常-->
<error-page>
<error-code>500</error-code>
<location>/500.jsp</location>
</error-page>
<!--处理404异常-->
<error-page>
<error-code>404</error-code>
<location>/404.jsp</location>
</error-page>

5 拦截器

// interceptor

// 类似于 Servlet 开发中的过滤器 Filter,用于对处理器进行预处理和后处理

// 将拦截器按一定的顺序联结成一条链,这条链称为拦截器链(InterceptorChain)。在访问被拦截的方法或字段时,拦截器链中的拦截器就会按其之前定义的顺序被调用。拦截器也是AOP思想的具体实现
5.1 拦截器过滤器的区别
// 过滤器
	// 使用范围
	任何Java web工程都可使用
	// 拦截范围
	url-pattern 配置了/* 后可对所有要访问资源拦截
// 拦截器
	// 使用范围
	SpringMVC 框架工程	
	// 拦截范围
	只拦截访问的控制器方法,如访问jsp,html,css,image,js 不拦截
5.2 拦截器使用快速入门
// 创建拦截器类实现HandlerInterceptor接口
public class MyInterceptor1 implements HandlerInterceptor {
    // 在目标方法执行之前 拦截
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response,
    Object handler) {
    System.out.println("preHendle1");
    return true; // false 不放行, true 放行
    }
    // 在目标方法执行之后,视图对象返回之前 执行
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object
    handler, ModelAndView modelAndView) {
    System.out.println("postHandle1");
    }
    // 在流程都执行完毕后 执行
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response,
    Object handler, Exception ex) {
    System.out.println("afterCompletion1");
    }
}

// 配置拦截器
<!--配置拦截器-->
<mvc:interceptors>
    <mvc:interceptor>
        <!--对哪些资源执行拦截操作-->
        <mvc:mapping path="/**"/> // 拦截所有资源
        <bean class="com.lagou.interceptor.MyInterceptor1"/>
    </mvc:interceptor>
</mvc:interceptors>
    
// 配置拦截器链 配置多个<mvc:interceptor>,拦截顺序按照配置顺序
    // 执行顺序pre1 pre2 业务逻辑 post2 post1 视图  after2 after1

JavaWeb - SpringMVC (2)

原文:https://www.cnblogs.com/pengc931482/p/14490994.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!