springMVC入门

neweastsun 2020-05-04

SpringMVC

入门

引入相关jar包或坐标

Spring-context,spring-web,spring-webmvc,servlet-api,jsp-api

相应配置
创建web工程

在web.xml下做相应配置

<web-app>
  <display-name>Archetype Created Web Application</display-name>

  <!--配置前端控制器-->
  <servlet>
    <servlet-name>dispatcherServlet</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
      <param-name>contextConfigLocation</param-name> 引入相关配置
      <param-value>classpath:springmvc.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup> 在程序加载的时候就执行,这样子就会引入相关的配置启动spring的ioc注入
  </servlet>
  <servlet-mapping>
    <servlet-name>dispatcherServlet</servlet-name>
    <url-pattern>/</url-pattern>
  </servlet-mapping>

  <!--配置解决中文乱码的过滤器-->
  <filter>
    <filter-name>characterEncodingFilter</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>characterEncodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>

</web-app>

在资源路径下配置springmvc.xml,需要开启spring的ioc注入

<context:component-scan base-package="com.yyx.mvc"></context:component-scan>

<!-- 视图解析器 -->
<bean id="internalResourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="prefix" value="/WEB-INF/pages/"/>  解析的路径
    <property name="suffix" value=".jsp" />
</bean>
    <!-- mvc注解支持 -->
    <mvc:annotation-driven/>

在/WEB-INF/pages/新建一个.jsp文件写入你想显示的内容

最后写你的controller层的java代码

@Controller
public class HelloSpringmvc {

    @RequestMapping(path = "/hello") 和servelet的原理一下,当访问这个路径的时候就会执行,建立一个映射关联
     path和value属性一样的效果,只写value的时候可以省略属性名
     method属性决定接收什么请求,枚举类型RequestMehod
     params指定访问时必须传输的属性
     headers指定要求的请求头
    public String hello(){
        return "success";通过视图解析器进行跳转,和对应的名字一样的jsp文件显示
    }
}

成功编写springmvc的入门程序

请求参数的绑定

实体类都需要序列化,序列化可以形成字节流,可以在不同的平台应用程序里面跑

零散数据

请求地址中加入类似htttp://......?username=XXX&password=XXX

可以在对应的方法中的参数中直接添加,会通过key,value的形式,匹配key也就是username对应参数中的username,就能接收到前端请求来的数据

表单数据

建立一个实体类,实体类的属性名要和表单的每个数据的name一样,如果实体类中有引用类型的数据,比如又是i一个类,可以在表单中用类名.属性给实体类中的类赋值。然后就可以直接在请求的方法中的参数使用实体类来作为参数接收

如果有list或者map集合,list对应在表单中写list属性名[索引].属性添加数据,map在对应的表单中写map属性名[key].value

自定义类型转换器

写一个类implements Converter<S, T>实现方法

常用注解

@RequestParam

解决在方法中你可以写与传过来参数不同名字的参数,但是在注解的name属性中要写与传过来的参数名字相同

required属性默认为true代表必须有参数传递并且必须和name属性的名字相同

@RequestBody

获取请求体的内容,不适用于get请求(get不包含请求体),获得整体的key=value&key=value……的形式

@PathVaribale

用于绑定url中的占位符,如controller层中地址映射为/user/{id} ,{id}就是占位符,请求地址就可写/user/10

@RequestHeader

用于获得请求头的值

@CookieValue

获取指定名称的Cookie值

@ModelAttribute

出现在方法上,表示当前方法会在控制器的方法之前。

@SessionAttribute

用于多次执行控制器方法间的参数共享,将参数存入session域,需要在方法中加入Model或ModelMap参数去add或者getAttribute值 SessionStatus可以清楚Session

响应数据

返回字符串

通过视图解析器,将你的返回的字符串作为名字,后缀为视图解析器中添加的如.jsp,最后就会解析到这个网页中,可以在方法中添加Model model参数,addAttribute将你需要查询的东西放进去然后解析后的页面可以通过el表达式取得里面的东西

关键字方式,返回值为"foward:地址"转发方式,"redirect:地址"重定向底层加了前缀的默认名称

void类型

默认请求视图解析器中设置的路径下的方法名.jsp的文件,也可以通过写入request和response参数,通过request的请求转发或者response的重定向或response的输出流跳转到自己想去的页面(后者不会通过视图解析器)

ModelAndView

ModelAndView的对象中setViewName会找视图解析器,返回字符串的底层就用到了ModelAndView

ResponseBody响应json数据

导入有关json数据的jar包或坐标,jackson-databind,jackson-core,jackson-annotations

<!--    在 springmvc 的配置文件中可以配置,静态资源不过滤:-->
    <!-- location表示路径,mapping表示文件,**表示该目录下的文件以及子目录的文件 -->
    <mvc:resources location="/css/" mapping="/css/**"/>
    <mvc:resources location="/images/" mapping="/images/**"/> 
    <mvc:resources location="/scripts/" mapping="/javascript/**"/>

发送原生ajax请求

$({ url:请求地址,contentType:"application/json;charset=UTF-8"发送过去的数据类型,data:‘{}‘数据,dataType:预期服务器返回的值,type:"请求方式默认get",success:"成功处理函数"})

在返回类型的对象上加@ResponseBody可以将对象变成json数据

文件上传

导入commons-fileupload,commons-io

传统方式上传

form表单中的enctype必须是multipart/form-data以及是post请求进行上传

public String fileupload1(HttpServletRequest request){
    String realPath = request.getSession().getServletContext().getRealPath("/uploads/");
    File file = new File(realPath);
    if(!file.exists()){
        file.mkdir();
    }
    DiskFileItemFactory factory = new DiskFileItemFactory();
    ServletFileUpload upload = new ServletFileUpload(factory);

    try {
        List<FileItem> fileItems = upload.parseRequest(request);
        for (FileItem item:fileItems) {
            if(item.isFormField()){
                //说明普通表单项
            }else {
                //说明是上传文件项
                String filename = item.getName();
                try {
                    item.write(new File(realPath,filename));
                    System.out.println(realPath);
                    item.delete();//删除临时文件
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }

    } catch (FileUploadException e) {
        e.printStackTrace();
    }

    return "success";
}
SpringMVC文件上传

配置文件解析器

<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
  id必须叫这个
    <property name="maxUploadSize" value="字节为单位" />
</bean>

方法

public String fileload2(HttpServletRequest request,MultipartFile upload){
         String realPath = request.getSession().getServletContext().getRealPath("/uploads/");
         File file = new File(realPath);
         if(!file.exists()){
             file.mkdir();
         }
         String filename = upload.getName();
         try {
             upload.transferTo(new File(realPath,filename));
         } catch (IOException e) {
             e.printStackTrace();
         }
         return "success";
     }
MultipartFile的参数名必须和form表单中input的type为file的name一样
SpringMVC跨服务器方式的文件上传

导入jersey-core和jersey-client

public String fileload3(,MultipartFile upload){
    String path="另外一个服务器的路径";
    String filename = upload.getName();
    Client client = Client.create();
    WebResource resource = client.resource(path + filename);
    try {
        resource.put(upload.getBytes());
    } catch (IOException e) {
        e.printStackTrace();
    }
    return "success";
}

SpringMVC拦截器

异常处理器

编写一个自定义异常

编写异常处理器类实现HandlerExceptionResolver,解决中使用ModelAndView

将异常处理器的类写入xml中

拦截器

编写拦截器的类实现HandlerInterceptor

配置拦截器xml

preHandle预处理 controller执行前

postHandle后处理 controller执行后,跳转页面之前

afterCompletion 跳转页面执行后,该方法执行,最后执行

<mvc:interceptors>
    <mvc:interceptor>
        <mvc:mapping path=""/>配置你要拦截的方法
        <mvc:exclude-mapping path=""/>配置你不要拦截的方法
          <bean class=""></bean> 配置你的拦截器的类
    </mvc:interceptor>
</mvc:interceptors>

相关推荐