百木园-与人分享,
就是让自己快乐。

SpringMVC开发简介

SpringMVC开发简介

SpringMVC开发步骤

  1. 导入SpringMVC相关依赖

porm.xml:

<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-webmvc</artifactId>
  <version>${spring.version}</version>
</dependency>
  1. 配置SpringMVC核心控制器(DispatchSevlet)

web.xml:

<servlet>
  <servlet-name>dispatcherServlet</servlet-name>
  <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  <init-param>//引入spring的配置文件sping-mvc.xml
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath:spring_mvc-servlet.xml</param-value>
  </init-param>
  <load-on-startup>1</load-on-startup>//服务器启动即加载
</servlet>
<servlet-mapping>
  <servlet-name>dispatcherServlet</servlet-name>
  <url-pattern>/</url-pattern>//拦截所有请求
</servlet-mapping>
  1. 创建Controller类和视图页面
  2. 使用注解配置Controller类中业务方法的映射地址

HelloController.java:

@Controller//控制器注解
public class HelloController{
    @RequestMapping(value = \"/do\")//dispatchservlet分发路径
    public ModelAndView handleRequest(javax.servlet.http.HttpServletRequest httpServletRequest, javax.servlet.http.HttpServletResponse httpServletResponse) throws Exception {
        ModelAndView mav = new ModelAndView();
        mav.addObject(\"msg\",\"hahahha\");
        mav.setViewName(\"show.jsp\");
        return mav;
    }
}
  1. 配置SpringMVC核心文件spring-mvc.xml(组件扫描)

spring-mvc-servlet.xml:

<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\"
       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\">
    <!-- 组件扫描 -->
    <context:component-scan base-package=\"com.controller\"/>
</beans>
  1. 测试

问题1:跳转页面404

问题定位: JSP文件中的超链接标签的href属性加入了“/”,导致跳转域名是上一级目录
问题解决: 不加“/”,或者去Tomcat的Server.xml文件中让path为空(即去掉项目名称)

SpringMVC流程分析

  1. 用户发送请求到前端控制器DispatchServlet
  2. DispatcherServlet收到请求调用HandlerMapping处理器映射器
  3. 处理器映射找到具体的处理器(可根据XML配置、注解进行查找),生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet
  4. DispatcherServlet调用HandlerAdaptor处理适配器
  5. HandlerAdapptor适配调用具体的处理器Controller
  6. Controller执行业务逻辑返回ModelAndView
  7. HandlerAdaptor将ModelAndView对象返回给DispatcherServlet
  8. DispatcherServlet调用视图解析器ViewResolver视图解析器处理ModelAndView
  9. ViewResolver解析完成返回具体的View给DispatherServlet
  10. DispatcherServlet将View进行渲染(将模型数据进行填充页面)后返回给客户端

SpringMVC注解解析

@RequestMapping

作用:用于建立请求URL和处理请求方法之间的对应关系

位置:

  • Controller类上,请求URL访问的第一级目录,不写的话默认为根目录
  • 具体的方法上,请求URL访问的第二级目录,与一级目录共同构成访问的虚拟路径

属性:

  • value: 用于指定请求的URL,如value=\"/hello\"
  • method: 用于指定请求的方式,如method=RequestMethod.GET
  • params: 用于指定限定请求参数,如params=\"name\"表示请求参数必须有name属性

组件扫描

SpringMVC基于Spring容器,需要将Controller等对象放到Spring容器中,所以需要进行组件扫描才能使用注解,如<contex: component-scan base-package=\"com.rsk.controller\">

视图解析器

将SpingMVC默认的视图解析器(DispatcherServlet.properties)进行重新配置,主要修改URL前缀和后缀

    <!--配置视图资源解析器-->
    <bean id=\"viewResolver\" class=\"org.springframework.web.servlet.view.InternalResourceViewResolver\">
        <property name=\"prefix\" value=\"/jsp/\"></property>
        <property name=\"suffix\" value=\".jsp\"></property>
    </bean>

SpringMVC数据响应方式

页面跳转

  • 直接返回字符串:将返回的字符串与视图解析器的前后缀拼接起来后跳转
  • 返回ModelAndView对象

回写数据

  • 直接返回字符串:@ResponseBody可以指定SpringMVC直接返数据String或者封装成JSON格式的String,不需要进行视图解析。
  • 返回对象或集合:在spring-mvc.xml中添加<mvc:annotation-driven/>来加载注解驱动,依然需要@ResponseBody

SpringMVC获得请求数据

参数类型一致

获得请求参数:GET:name=value&name=value...,服务器需要对其进行封装,SpringMVC可接受如下类型参数:

  • 基本类型参数:需要在参数列表添加与URL字段对应的String或者Int(SpringMVC自动转换)
  • POJO(Plain Ordinary Java Object)类型参数:直接在方法参数列表使用对象如User user
  • 数组类型参数:直接在方法参数列表使用字符串数组
  • 集合类型参数:POST请求需要将其封装到一个POJO对象中,AJAX给的contexType是一个JSON请求,则可以直接在方法参数列表获取如@ResponseBpdy List<User> userList

参数类型不一致

当请求的参数名称与Controller的业务方法中的名称不一致时,就需要使用注解@RequestParam注解显示绑定参数

  • value:请求参数名称
  • required:指定该参数是否必须包括,提交时没有该参数则会报错
  • defaultValue: 当没有指定参数时,使用指定默认值赋值
    @ResponseBody
    public void save8(@RequestParam(value = \"name\", required = false, defaultValue = \'defaltName\') String username, int age) throws IOException {
        System.out.println(username);
        System.out.println(age);
    }

获取Servlet的相关API

SpringMVC支持使用原始ServletAPI对象作为控制器方法的参数进行注入,常用对象如下:

  • HttpServletResponse
  • HttpServletRequest
  • HttpSession
    @RequestMapping(\"/do9\")
    @ResponseBody
    public void save9(HttpServletRequest req, HttpServletResponse res, HttpSession session) throws IOException{
        System.out.println(req);
        System.out.println(res);
        System.out.println(session);
    }

获取请求头

@RequestHeader

使用@RequestHeader可以获得请求头信息,相当于javaweb的reques.getHeader(name),有如下属性

  • value: 请求头名称
  • required:是否必须携带此请求头
    @RequestMapping(\"/do10\")
    @ResponseBody
    public void save10(@RequestHeader(value = \"User-Agent\", required = false) String user_agent) throws IOException{
        System.out.println(user_agent);
    }

@CookieValue

使用@CookieValue可以获取指定的cookie值,有如下属性

  • value: 指定cookie名称
  • required:指定是否必须携带cookie
    @RequestMapping(\"/do11\")
    @ResponseBody
    public void save11(@CookieValue(value = \"JSESSIONID\", required = false) String cookie) throws IOException{
        System.out.println(cookie);
    }

文件上传

1.文件上传三要素:

  • 表单项type=\"file\"
  • 表单提交方式:post
  • 表单enctype属性是多部分表单形式,即enctype=“multipart/form-data”
   <form action=\"do12\" method=\"post\" enctype=\"multipart/form-data\">
       名称<input type=\"text\" name=\"username\"><br/>
       文件<input type=\"file\" name=\"upload\"><br/>
       <input type=\"submit\" value=\"提交\">
   </form>

2.单文件上传步骤

  • 导入fileupload和IO依赖坐标
    <dependency>
      <groupId>commons-fileupload</groupId>
      <artifactId>commons-fileupload</artifactId>
      <version>1.4</version>
    </dependency>
    <dependency>
      <groupId>commons-io</groupId>
      <artifactId>commons-io</artifactId>
      <version></version>
    </dependency>
  • 配置文件上传解析器
    <!--配置文件上传解析器-->
    <bean id=\"multipartResolver\" class=\"org.springframework.web.multipart.commons.CommonsMultipartResolver\">
        <!--上传文件总大小-->
        <property name=\"maxUploadSize\" value=\"5242800\"/>
        <!--上传单个文件大小-->
        <property name=\"maxUploadSizePerFile\" value=\"5245555\"/>
        <!--上传文件编码类型-->
        <property name=\"defaultEncoding\" value=\"UTF-8\"/>
    </bean>
  • 编写文件上传代码
    @RequestMapping(\"/do12\")
    public String save12(String name, MultipartFile file) throws IOException{
        String originalFilename = file.getOriginalFilename();
        file.transferTo(new File(\"url\" + originalFilename));
        return \"fileUpload\";
    }

拦截器interceptor

类似于Servlet中的过滤器Filter,用于对处理器进行预处理和后处理,是AOP思想的具体实现。

  1. 创建拦截器类实现Handerinterceptor接口
public class myInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception {
        //方法执行之前执行
        System.out.println(\"prehandle\");
        //true放行
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {
        //return之前执行
        System.out.println(\"post\");
    }

    @Override
    public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {
        //方法执行完毕后执行
        System.out.println(\"after\");
    }
}

  1. Spring-mvc.xml中配置拦截器
    <!--配置拦截器-->
    <mvc:interceptors>
        <mvc:interceptor>
            <!--资源拦截-->
            <mvc:mapping path=\"/do\"/>
            <!--拦截器定位-->
            <bean class=\"interceptor.myInterceptor\"/>
        </mvc:interceptor>
    </mvc:interceptors>
  1. 拦截器应用场景——用户登陆判断(在长时间没有进行操作后,服务器端的session会消失,因此当用户在点击其他操作时候,可利用拦截器的postHandler方法来判断用户session是否可用,如果为null则跳转到登陆页面)

SpringMVC异常处理

  1. 使用简单异常处理器SimpleMappingExceptionResolver
    <!--简单异常处理器配置-->
    <bean class=\"org.springframework.web.servlet.handler.SimpleMappingExceptionResolver\">
        <property name=\"defaultErrorView\" value=\"error\"/>
        <property name=\"exceptionMappings\">
            <map>
                <entry key=\"java.lang.ClassCastException\" value=\"error\"/>
            </map>
        </property>
    </bean>
  1. 自定义异常处理
  • 创建异常处理类实现HandlerExceptionResolver
public class myExceptionResolver implements HandlerExceptionResolver {
    @Override
    public ModelAndView resolveException(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) {
        return null;
    }
}

  • 配置异常处理类
    <!--自定义异常配置-->
    <bean class=\"Exception.myExceptionResolver\"/>

问题1 WEB-INf下的静态资源访问

解决方案:在spring-mvc.xml中配置访问地址

    <!--开发资源访问-->
    <mvc:resources mapping=\"/img/**\" location=\"/img/\"/>
    <!--默认开发资源访问,交给Tomcat服务器去找-->
    <mvc:default-servlet-handler/>

问题2 解决中文乱码

解决方案: 在web.xml中配置全局的过滤器,指定解码方式为UTF-8

  <!--配置全局的过滤Filter, 解决乱码问题-->
  <filter>
    <filter-name>CharacterEncoding</filter-name>
    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
    <init-param>
      <param-name>encoding</param-name>
      <param-value>UTF-8</param-value>
    </init-param>
  </filter>
  <filter-mapping>
    <filter-name>CharacterEncoding</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>


来源:https://www.cnblogs.com/rskblog/p/16257527.html
本站部分图文来源于网络,如有侵权请联系删除。

未经允许不得转载:百木园 » SpringMVC开发简介

相关推荐

  • 暂无文章