SpringMVC学习

SpringMVC

1 概述

1.1 MVC是什么

M:model模型 JavaBean

V:view视图 JSP

C:Controller控制器 Servlet

1.2 SpringMVC与Struts2的优劣分析

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-r2XsA3XD-1603038932970)(D:\Study\笔记\图\image-20201014200726325.png)]

2 程序的基本流程

2.1 入门配置

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-flkRuS9M-1603038932973)(D:\Study\笔记\图\image-20201015131115992.png)]

2.2 基本执行流程

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zruPRGRV-1603038932975)(D:\Study\笔记\图\image-20201015131339691.png)]

2.3 基本组件

DispatcherServlet:前端控制器,是整个流程控制的中心,由它调用其它组件处理用户的请求,它的存在降低了组件之间的耦合性

HandlerMapping:处理器映射器,负责根据用户请求找到Handler即处理器。

Handler:处理器,它就是我们开发中要编写的具体业务控制器,由DispatcherServlet把用户请求转发到Handler。由Handler对具体的用户请求进行处理。

HandlAdapter:处理器适配器

View Resolver:视图解析器,负责将处理结果生成View视图

View:视图

<mvc:annotation-driven>说明:
    在SpringMVC的各个组件中,处理器映射器、处理器适配器、视图解析器称为SpringMVC的三大组件。 使用<mvc:annotation-driven>自动加载RequestMappingHandlerMapping(处理映射器)和RequestMappingHandlerAdapter(处理适配器),可用在SpringMVC.xml配置文件中使用<mvc:annotation-driven>替代注解处理器和适配器的配置。

3 基本配置

3.1 bean.xml配置

<!-- 开启注解扫描 -->
<context:component-scan base-package="cn.itcast"/>

<!-- 视图解析器对象 -->
<bean id="internalResourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="prefix" value="/WEB-INF/pages/"/>
    <property name="suffix" value=".jsp"/>
</bean>

<!-- 开启SpringMVC框架注解的支持 -->
<mvc:annotation-driven/>

3.2 注解

@Controller:声明该类可以被扫描到

@RequestMapping:声明该方法的路径
将该注解放到类上声明一级目录,放在方法上声明二级目录
属性值:
value(path):资源路径,可以设置成path也可以设置成value
method={}:指定请求方式
params={}:指定限制请求参数的条件,支持简单的表达式,要求请求参数的

3.3 请求参数的绑定

SpringMVC绑定请求参数的过程是通过把表单提交请求参数,作为控制器中方法参数进行绑定的。

3.3.1 支持的技术类型

基本类型参数: 包括基本类型和String类型

POJO类型参数: 包括实体类,以及关联的实体类

数组和集合类型参数: 包括List结构和Map结构的集合(包括数组)

3.3.2 使用要求

如果是基本类型或者String类型: 要求我们的参数名称必须和控制器中方法的形参名称保持一致。(严格区分大小写)

如果是POJO类型,或者它的关联对象: 要求表单中参数名称和POJO类的属性名称保持一致。并且控制器方法的参数类型是POJO类型。

如果是集合类型,有两种方式:

第一种: 要求集合类型的请求参数必须在POJO中。在表单中请求参数名称要和POJO中集合属性名称相同。 给List集合中的元素赋值,使用下标。 给Map集合中的元素赋值,使用键值对。

第二种: 接收的请求参数是json格式数据。需要借助一个注解实现。

3.4 其他常用注解

@RequestParam
作用:把请求中指定名称的参数给控制器中的形参赋值。
属性:value:请求参数中的名称。
required:请求参数中是否必须提供此参数。默认值:true。表示必须提供,如果不提供将报错。

@RequestBody
作用:用于获取请求体内容。直接使用得到是key=value&key=value…结构的数据。get请求方式不适用。
属性:required:是否必须有请求体。
默认值是:true。当取值为true时,get请求方式会报错。如果取值为false,get请求得到是null。

@PathVaribale
作用:用于绑定url中的占位符。
属性:value:用于指定url中占位符名称。 required:是否必须提供占位符。

@RequestHeader
作用:用于获取请求消息头。
属性:value:提供消息头名称 required:是否必须有此消息头
ps:实际开发不怎么用

@CookieValue
作用:用于把指定cookie名称的值传入控制器方法参数。
属性:value:指定cookie的名称。 required:是否必须有此cookie。

@ModelAttribute
作用:用于修饰方法和参数。
出现在方法上,表示当前方法会在控制器的方法执行之前,先执行。它可以修饰没有返回值的方法,也可以修饰有具体返回值的方法。 出现在参数上,获取指定的数据给参数赋值。
属性:value:用于获取数据的key。key可以是POJO的属性名称,也可以是map结构的key。

@SessionAttribute
作用:用于多次执行控制器方法间的参数共享。
属性:value:用于指定存入的属性名称 type:用于指定存入的数据类型。

4 响应

4.1 返回值是String

@RequestMapping("/testString")
public String testString(Model model){
    System.out.println("testString方法执行了...");
    // 模拟从数据库中查询出User对象
    User user = new User();
    user.setUsername("美美");
    user.setPassword("123");
    user.setAge(30);
    // model对象
    model.addAttribute("user",user);
    return "success";
}

4.2 无返回值

@RequestMapping("/testVoid")
public void testVoid(HttpServletRequest request, HttpServletResponse response) throws Exception{
    //System.out.println("testVoid方法执行了");
    //编写请求转发的程序
    //request.getRequestDispatcher("/WEB-INF/pages/success.jsp").forward(request,response);

    //重定向
    //response.sendRedirect(request.getContextPath()+"index.jsp");

    //设置中文乱码
    response.setCharacterEncoding("UTF-8");
    response.setContentType("text/html;charset=UTF-8");
    //直接会进行相应
    response.getWriter().print("你好");

    return;
}

4.3 返回ModelAndView

@RequestMapping("/testModelAndView")
public ModelAndView testModelAndView(){
    //创建ModelAndView对象
    ModelAndView mv = new ModelAndView();
    System.out.println("testModelAndView方法执行了...");
    // 模拟从数据库中查询出User对象
    User user = new User();
    user.setUsername("壮壮");
    user.setPassword("456");
    user.setAge(50);

    //把user对象存储到mv对象中,也会把user对象存入到request对象域中
    mv.addObject("user",user);

    //跳转到哪个页面
    mv.setViewName("success");
    return mv;
}

4.4 使用关键字的方式进行转发或者重定向

@RequestMapping("/testForwardOrRedirect")
public String testForwardOrRedirect(){
    System.out.println("testForwardOrRedirect方法执行了...");
    //请求的转发
    //return "forward:/WEB-INF/pages/success.jsp";

    //重定向
    return "redirect:/index.jsp";
}

4.5 ResponseBody响应json数据

@RequestMapping("/testAjax")
public @ResponseBody User testAjax(@RequestBody User user){
    System.out.println("testAjax方法执行了...");
    // 客户端发送ajax的请求,传的是json字符串,后端把json字符串封装到user对象中
    System.out.println(user);
    // 做响应,模拟查询数据库
    user.setUsername("haha");
    user.setAge(40);
    // 做响应
    return user;
}

5 SpringMVC实现文件上传

5.1 配置文件解析器

<!--配置文件解析器-->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
    <property name="maxUploadSize" value="10485760"></property>
</bean>

5.2 代码

@RequestMapping("fileUpLoad2")
public String fileUpLoad2(HttpServletRequest request, MultipartFile upload) throws Exception {
    System.out.println("SpringMVC文件上传");
    //使用fileupload组件完成文件上传
    //上传的位置
    String path = request.getSession().getServletContext().getRealPath("/uploads/");
    File file = new File(path);
    if (!file.exists()) {
        //创建该文件夹
        file.mkdirs();
    }	
    //说明上传文件项
    //获取上传文件的名称
    String filename = upload.getOriginalFilename();
    //文件名设置成唯一值
    String uuid = UUID.randomUUID().toString().replace("-", "");
    filename = uuid+"_"+filename;
    //完成文件上传
    upload.transferTo(new File(path,filename));
    return "success";
}

5.3 跨服务器文件上传

@RequestMapping("/fileupload3")
public String fileuoload3(MultipartFile upload) throws Exception {
    System.out.println("跨服务器文件上传...");
    // 定义上传文件服务器路径
    String path = "http://localhost:9090/uploads/";
    // 说明上传文件项
    // 获取上传文件的名称
    String filename = upload.getOriginalFilename();
    // 把文件的名称设置唯一值,uuid
    String uuid = UUID.randomUUID().toString().replace("-", "");
    filename = uuid+"_"+filename;
    // 创建客户端的对象
    Client client = Client.create();
    // 和图片服务器进行连接
    WebResource webResource = client.resource(path + filename);
    // 上传文件
    webResource.put(upload.getBytes());
    return "success";
}

6 异常处理

6.1 处理异常业务逻辑

@Override
public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
    //获取到异常对象
    SysException e = null;
    if (ex instanceof SysException){
        e = (SysException) ex;
    }else {
        e = new SysException("系统正在维护");
    }
    //创建ModelAndView对象
    ModelAndView modelAndView = new ModelAndView();
    modelAndView.addObject("errorMsg",e.getMessage());
    modelAndView.setViewName("error");
    return modelAndView;
}

6.2 配置异常处理器

<bean id="sysExceptionResolver" class="itcast.exception.SysExceptionResolver"></bean>

7 SpringMVC拦截器

7.1 配置拦截器

<!--配置拦截器-->
<mvc:interceptors>
    <mvc:interceptor>
        <!--要拦截的具体的方法-->
        <mvc:mapping path="/user/*"/>
        <!--不要拦截的方法-->
        <!--<mvc:exclude-mapping path=""/>-->
        <!--配置拦截器对象-->
        <bean class="cn.itcast.interceptor.MyInterceptor1"></bean>
    </mvc:interceptor>
    <mvc:interceptor>
        <mvc:mapping path="/user/*"/>
        <bean class="cn.itcast.interceptor.MyInterceptor2"></bean>
    </mvc:interceptor>
</mvc:interceptors>

7.2 拦截器类

public class MyInterceptor1 implements HandlerInterceptor {

    /**
     * 预处理,controller方法执行前
     * return true放行,执行下一个拦截器,如果没有就执行controller中的方法
     * return false不放行
     */
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
        System.out.println("MyInterceptor1执行了。。。前111");
        return true;
    }

    /**
     * 后处理,controller方法执行后,success.jsp执行前
     */
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("MyInterceptor1执行了...后111");
    }

    /**
     * success.jsp页面执行后,该方法会执行
     */
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("MyInterceptor1执行了...完111");
    }
}

ew) throws Exception {
System.out.println(“MyInterceptor1执行了…后111”);
}

/**
 * success.jsp页面执行后,该方法会执行
 */
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
    System.out.println("MyInterceptor1执行了...完111");
}

}


评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值