Spring-MVC

2021-09-16  本文已影响0人  Zeppelin421

Spring MVC是Spring给我们提供的一个用于简化Web开发的框架

简介

MVC体系

常用的开发框架一般基于两种形式,一种C/S架构,一种B/S架构。在JavaEE开发中,几乎都是基于B/S架构的。在B/S架构中,系统标准的三层包括:表现层、业务层、持久层。

MVC设计

MVC全名Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,是一种用于设计创建Web应用程序表现层的模式。

TIPS:MVC提倡每一层只编写自己的东西,不编写任何其他的代码;分层是为了解耦,为了维护方便和分工协作

Spring MVC

SpringMVC全名Spring Web MVC,是一种基于Java实现的MVC设计模型的请求驱动类型的轻量级Web框架,属于spring-framework后续产品。SpringMVC本质可以认为是对Servlet的封装,简化了我们Servlet的开发

工作流程

1、配置DispatchServlet前端控制器
2、开发处理具体业务逻辑的Handler(@Controller、@RequestMapping)
3、xml配置文件配置Controller扫描,配置springmvc三个件
4、将xml文件路径告诉springmvc(DispatchServlet)

请求处理流程

九大组件

参数绑定

public ModelAndView handle(HttpServletRequest request, HttpServletResponse response, HttpSession session) {}
public ModelAndView handle(@RequestParam("ids") Integer id, Boolean flag) {}
public ModelAndView handle(User user) {}
public class QueryVO {
    private User user;
}
// url: /demo/handle?user.id=1&user.username=zhangsan
public ModelAndView handle(QueryVO query) {}
// 定义类型转换器
public class DateConverter implements Converter<String, Date> {
    public Date convert(String source) {
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
        try {
            Date parse = simpleDateFormat.parse(source);
            return parse;
        } catch (ParseException e) {}
    }
    return null;
}

// 注册自定义类型转换器
<!-- 自动注册最合适的处理器映射器,处理器适配器 -->
<mvc:annotation-driven conversion-service="conversionServiceBean"/>
<!--注册自定义转化器-->
<bean id="conversionServiceBean" class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
    <property name="converters">
        <set>
            <bean class="com.xxx.converter.DateConverter"/>
        </set>
    </property>
</bean>

@RequestMapping("/handle")
public ModelAndView handle(Date birthday) {
}

RESTful风格支持

RESTful风格URL:互联网所有的事物都是资源,要求URL中只有表示资源的名词,没有动词
RESTful风格资源操作:使用HTTP请求中的method方法put、delete、post、get来操作资源,分别对应添加、删除、修改、查询。不过一般使用时还是POST和GET。PUT和DELETE几乎不用
RESTful风格资源表述:可以根据需求对URL定位的资源返回不同的表述(也就是返回数据类型,比如XML、JSON等数据格式)
SpringMVC支持RESTful风格请求,具体讲就是使用@PathVariable注解获取RESTful风格的请求URL中的路径变量

<form method="post" action="/demo/handle">
    <input type="text" name="username"/>
    <input type="submit" value="修改"/>
</form>
<form method="post" action="/demo/handle/15/lisi">
    <input type="hidden" name="_method" value="put"/>
    <input type="submit" value="新增"/>
</form>
<form method="post" action="/demo/handle">
    <input type="hidden" name="_method" value="delete"/>
    <input type="submit" value="删除"/>
</form>

@RequestMapping(value = "/demo/handle/{id}", method={RequestMethod.GET}
public ModelAndView get(@PathVariable("id") Integer id) {
}

@RequestMapping(value = "/demo/handle/{id}/{name}", method={RequestMethod.PUT}
public ModelAndView add(@PathVariable("id") Integer id, @PathVariable("username") String username) {
}

@RequestMapping(value = "/demo/handle/{id}", method={RequestMethod.POST}
public ModelAndView update(@PathVariable("id") Integer id, String username) {
}

@RequestMapping(value = "/demo/handle/{id}", method={RequestMethod.DELETE}
public ModelAndView add(@PathVariable("id") Integer id) String username) {
}

<!-- 配置springmvc请求方式转换过滤器,会检查请求参数中是否有_method参数,如果有就按照指定的请求方式进行转换-->
<filter>
    <filter-name>hiddenHttpMethodFilter</filter-name>
    <filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>hiddenHttpMethodFilter</filter-name>
    <url-pattern>/*<url-pattern>
</filter-mapping>

Ajax Json交互

@ResponseBody注解
@ResponseBody注解的作用是将Controller的方法返回的对象通过适当的转化器转化为指定的格式之后,写入到response对象的body区,通常用来返回JSON数据或者XML数据。
TIPS:在使用此注解之后不会再走视图处理器,而是直接将数据写入输入流中,它的效果等同于通过response对象输入指定格式的数据

@RequestMapping("/handle")
public @ResponseBody User handle(@RequestBody User user) {
}

SpringMVC高级技术

拦截器(Interceptor)

监听器、过滤器和拦截器对比

控制器中处理异常

@ControllerAdvice
public class GlobalExceptionResolver {
    @ExceptionHandler(ArithmeticException.class)
    public ModelAndView handleException(ArithmeticException exception, HttpServletResponse response) {
        ModelAndView modelAndView = new ModelAndView();
        modelAndView.addObject("msg", exception.getMessage());
        modelAndView.setViewName("error");
    }
}

基于Flash属性的跨重定向请求数据传递

重定向时请求参数会丢失,我们往往需要重新携带请求参数,我们可以进行手动参数拼接。
return "redirect:handle?name=" + name;
但上述拼接参数的方法属于get请求,携带参数长度有限,参数安全性也不高,此时,我们可以使用SpringMVC提供的flash属性机制,向上下文中添加flash属性,框架会在session中记录该属性,当跳转到页面之后框架会自动删除flash属性,不需要我们手动删除,通过这种方式进行重定向参数传递,参数长度和安全性都得到了保障。

@RequestMapping("/handle")
public String handle(String name, RedirectAttributes redirectAttributes) {
    redirectAttributes.addFlashAttribute("name", name);
    return "redirect:handle01";
}
上一篇 下一篇

猜你喜欢

热点阅读