SpringMVC=SpringMVC请求参数以及文件上传

一.SpringMVC的请求:

新建web项目:pom.xml的座标导入:

 <dependencies>
    <!--mysql驱动-->
    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>5.1.47</version>
    </dependency>
    <!--druid连接池-->
    <dependency>
      <groupId>com.alibaba</groupId>
      <artifactId>druid</artifactId>
      <version>1.1.15</version>
    </dependency>
    <!--spring-jdbc-->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-jdbc</artifactId>
      <version>5.1.5.RELEASE</version>
    </dependency>
    <!--spring核心-->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-context</artifactId>
      <version>5.1.5.RELEASE</version>
    </dependency>
    <!--junit-->
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.12</version>
    </dependency>
    <!--spring整合junit-->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-test</artifactId>
      <version>5.1.5.RELEASE</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-orm</artifactId>
      <version>5.1.5.RELEASE</version>
    </dependency>
    <dependency>
      <groupId>org.aspectj</groupId>
      <artifactId>aspectjweaver</artifactId>
      <version>1.9.5</version>
    </dependency>

    <!--springMVC-->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-webmvc</artifactId>
      <version>5.1.5.RELEASE</version>
    </dependency>
    <!--servlet-->
    <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>servlet-api</artifactId>
      <version>2.5</version>
      <scope>provided</scope>
    </dependency>
    <!--jsp-->
    <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>jsp-api</artifactId>
      <version>2.0</version>
      <scope>provided</scope>
    </dependency>

    <dependency>
      <groupId>org.projectlombok</groupId>
      <artifactId>lombok</artifactId>
      <version>1.18.10</version>
    </dependency>

    <dependency>
      <groupId>commons-fileupload</groupId>
      <artifactId>commons-fileupload</artifactId>
      <version>1.4</version>
    </dependency>
  </dependencies>
  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>3.1</version>
        <configuration>
          <source>1.8</source>
          <target>1.8</target>
          <encoding>UTF-8</encoding>
        </configuration>
      </plugin>
    </plugins>
  </build>

(1)请求参数:

客户端请求参数的格式是:name=value&name=value……

服务器要获取请求的参数,有时还需要进行数据的封装,SpringMVC可以接收如下类型的参数:

① 简单类型

基本类型,基本类型的包装类型,字符串

index.jsp


<h1>简单类型参数访问</h1>

<a href="${pageContext.request.contextPath}/user/simpleParam?username=java&age=19">简单参数接收</a>

UserController

@Controller
@RequestMapping("/user")
public class UserController {

    //简单参数
    @RequestMapping("/simpleParam")
    public String simpleParam(String username,Integer age){
        System.out.println("姓名:"+username);
        System.out.println("年龄:"+age);
        return "success";
    }
}

注意:前端页面的name属性名必须与方法中的形参名称一致,类型自定义

② 对象类型

User

@Data
@NoArgsConstructor
@AllArgsConstructor
public class User {

    private String username;

    private Integer age;
}
<h1>对象类型</h1>

<form action="${pageContext.request.contextPath}/user/objectParam" method="post">
    用户名:<input type="text" name="username"> <br>
    年龄:<input type="text" name="age"><br>
    <input type="submit" value="提交">
</form>

UserController

    //对象参数
    @RequestMapping("/objectParam")
    public String objectParam(User user){
        System.out.println(user);
        return "success";
    }

注意:表单元素的name属性必须和user实体的属性名一致

③ 数组类型

应用场景:批量删除

index.jsp


<h1>数组类型</h1>
<form action="${pageContext.request.contextPath}/user/arrayParam" method="post">
    <input type="checkbox" name="hobby" value="1" >足球 <br>
    <input type="checkbox" name="hobby" value="2" >篮球 <br>
    <input type="checkbox" name="hobby" value="3" >乒乓球 <br>
    <input type="checkbox" name="hobby" value="4" >游泳 <br>
    <input type="checkbox" name="hobby" value="5" >爬山 <br>

    <input type="submit"  value="爱好" > <br>
</form>

UserController

//数组参数
    @RequestMapping("/arrayParam")
    public String arrayParam(Integer[] hobby){
        System.out.println(Arrays.toString(hobby));
        return "success";
    }

注意:复选框的name属性名必须与数组的变量名一致:

④ 集合(复杂)类型

如果提交的是一个集合的数据,springMVC的方法形参是无法接收的,必须要通过实体类进行包装才行

QueryVo

@Data
@NoArgsConstructor
@AllArgsConstructor
public class QueryVo {

    private String orderId;

    private User user;

    private Integer[] hobby;

    private List<Object> list;

    private Map<String,Object> map;

}

index.jsp

<h1>复合类型</h1>

<form action="${pageContext.request.contextPath}/user/allTypeParam" method="post">
    订单id:
    <input type="text" name="orderId" value="1" > <br>

    用户名:<input type="text" name="user.username"> <br>
    年龄:<input type="text" name="user.age"><br>

    爱好:
    <input type="checkbox" name="hobby" value="1" >足球 <br>
    <input type="checkbox" name="hobby" value="2" >篮球 <br>
    <input type="checkbox" name="hobby" value="3" >乒乓球 <br>
    <input type="checkbox" name="hobby" value="4" >游泳 <br>
    <input type="checkbox" name="hobby" value="5" >爬山 <br>
    list集合
   <%--
        list[0] == 第一个元素
        list[1] == 第二个元素
    --%>
    <input type="text" name="list[0]"   placeholder="第一个元素">
    <input type="text" name="list[1]"   placeholder="第二个元素">
    <input type="text" name="list[2]"   placeholder="第三个元素"> <br>
    map集合
 <%--
        map.put("key1",value);
        map.put("key2",value);
    --%>
    <input type="text" name="map['key1']" placeholder="key1的值...">
    <input type="text" name="map['key2']" placeholder="key2的值..."><br>
    
    <input type="submit" value="复杂类型">
</form>

UserController

//复杂参数
    @RequestMapping("/allTypeParam")
    public String allTypeParam(QueryVo queryVo){
        System.out.println(queryVo);
        return "success";
    }

 

(2)中文乱码过滤器:

如果是get请求,tomcat8以上版本的服务器统一了UTF-8编码,所以不会出现乱码

如果是post请求,由于servlet规范当中post默认解码方式为:ISO-8859-1,所以出现了中文乱码问题:

Spring框架提供了post请求中文过滤器

在web.xml 文件中配置如下即可:

	<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>

 

(3)自定义类型转换器

应用场景:日期格式:

springMVC框架默认将字符串转为日期对象的格式为(yyyy/MM/dd),这种格式在国内并不流行...

我们已经习惯使用了(yyyy-MM-dd),这时框架无法识别,页面出现400的错误

所以springMVC考虑全面 ..支持了自定义类型转换器的扩展...

自定义类型转换器:

/*
    自定义日期类型转换器(yyyy-MM-dd)
 */
public class DateConverter implements Converter<String, Date> {
    @Override
    public Date convert(String source) { // 字符串 (yyyy-MM-dd)
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
        Date date = null;
        try {
            date = simpleDateFormat.parse(source);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return date;
    }
}

spring-mvc.xml配置:

index.jsp

<h1>日期</h1>
<form action="${pageContext.request.contextPath}/user/getDate" method="post">
    生日:<input type="date" name="birthday"> <br>
    <input type="submit" value="日期">
</form>

UserController

    //=============================================日期相关:
    @RequestMapping("/getDate")
    public String getDate(Date birthday){
        System.out.println(birthday);

        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
        System.out.println(simpleDateFormat.format(birthday));
        return "success";
    }

注解方案:

需要把spring-mvc文件里的 关于时间转换的内容注释掉:然后修改UserController即可:

    //=============================================日期相关:
    @RequestMapping("/getDate")
    public String getDate(@DateTimeFormat(pattern = "yyyy-MM-dd") Date birthday){
        System.out.println(birthday);

        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
        System.out.println(simpleDateFormat.format(birthday));
        return "success";
    }

 

(4)其他相关注解

① @RequestParam

应用场景:分页查询:

index.jsp


<h1>分页参数RequestParam</h1>
<a href="${pageContext.request.contextPath}/user/findByPage?pageNum=1&size=10">分页查询</a>

UserController

    //=============================================分页查询:
    // 分页查询
    /*
        @RequestParam 注解
            常用属性
                name/value:帮我们解决请求参数名和方法的变量名不一致问题.....
                required: 默认值为true,要求前端必须提交参数和值...
                defaultValue:指定参数的默认值

     */
    @RequestMapping("/findByPage")
    public String findByPage(@RequestParam(name = "pageNum",defaultValue = "1") Integer currentPage,@RequestParam(name = "size",defaultValue = "10") Integer pageSize){
        System.out.println("==="+currentPage);
        System.out.println("==="+pageSize);

        return "success";
    }

 

② @RequestHeader

获取请求头,相当于:request.getHeader();

index.jsp

<h1>请求头信息</h1>
<a href="${pageContext.request.contextPath}/user/requestHeader">请求头信息</a>

UserController

    //=============================================获取请求头信息:
    @RequestMapping("/requestHeader")
    public String requestHeader(@RequestHeader("User-Agent") String userAgent,@RequestHeader("Cookie") String cookie){
        System.out.println("==="+userAgent);
        System.out.println("==="+cookie);

        return "success";
    }

 

③ @CookieValue

专门获取指定cookie名称的值

index.jsp

<h1>cookieValue信息</h1>
<a href="${pageContext.request.contextPath}/user/cookieValue">回去指定cookies信息</a>

UserController

    //=============================================获取指定CookieValue
    @RequestMapping("/cookieValue")
    public String cookieValue(@CookieValue("JSESSIONID") String  jsessionid){
        System.out.println("jsessionid--"+jsessionid);

        return "success";
    }

(5)获取Servlet相关API

我们也可以通过SpringMVC框架,操作Servlet原生API

index.jsp

<h1>servletAPI信息</h1>
<a href="${pageContext.request.contextPath}/user/servletApi?username=jack">servletAPI</a>

UserController


//=============================================获取servlet相关api
    @RequestMapping("/servletApi")
    public void servletApi(HttpServletRequest request, HttpServletResponse response, HttpSession session) throws ServletException, IOException{
        // 获取请求参数
        String username = request.getParameter("username");
        System.out.println(username);
        request.getRequestDispatcher("/WEB-INF/pages/success.jsp").forward(request, response);
    }

 

二.文件上传“”

(1)文件上传三要素:

  • 表单的提交方式 method="POST"

  • 表单的enctype属性是多部分表单形式 enctype=“multipart/form-data"

  • 表单项(元素)type="file"

<form action="" method="post" enctype="multipart/form-data">
    姓名:<input type="text" name="username"> <br>
    头像:<input type="file" name="picFile"> <br>
</form>

上传原理:

服务端代码如何获得请求体的内容

1.apache提供的file-uplaod工具包【开发中一般不用底层工具包】

2.Servlet3.0【原生servlet开发时使用...】

3.springMVC内置文件上传(底层集成了file-uplaod)常用

 

(2)SpringMVC实现文件上传

需求分析:

第一步:

<form action="${pageContext.request.contextPath}/user/upload"
      method="post" enctype="multipart/form-data">
    姓名:<input type="text" name="username"> <br>
    头像:<input type="file" name="picFile"> <br>
    <input type="submit" value="文件上传">
</form>

第二步:需要导入apache的文件上传依赖:

    <!--文件上传-->
    <dependency>
      <groupId>commons-fileupload</groupId>
      <artifactId>commons-fileupload</artifactId>
      <version>1.4</version>
    </dependency>

修改spring-mvc.xml

    <!--
        文件上传组件扩展
            id="multipartResolver"  此id必须是这个名称...
    -->
    <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
        <!--
            限定文件的大小....
            单位是字节(B)
            限制大约在5MB左右...
        -->
        <property name="maxUploadSize" value="5024000"></property>
    </bean>

第三步”

    // 文件上传
    @RequestMapping("/upload")
    public String upload(String username, MultipartFile picFile) {
        System.out.println("普通项:" + username);
        System.out.println("文件项:" + picFile);
        System.out.println("文件名:" + picFile.getOriginalFilename());
        // 保存到一个指定的磁盘目录
        try {
            picFile.transferTo(new File("d:\\"+picFile.getOriginalFilename()));
        } catch (IOException e) {
            e.printStackTrace();
        }

        return "success";
    }

 

三.静态资源访问的开启:

我们在以上项目中访问静态资源 01.jpg 图片时,出现了404问题,但是路径规则没问题。

原因:

在SpringMVC的前端控制器DispatcherServlet的url-pattern配置的是 /(缺省),代表除了jsp请求不拦截, 其他的所有请求都会拦截,包括一些静态文件(html、css、js)等, 而拦截住之后,它又找不到对应的处理器方法来处理, 因此报错.

 

 

开启方式有三种方式:

(1)方式一:

spring-mvc.xml

<!--
    静态资源手动映射
        mapping="/img/**" 浏览器发送请求
        location="/img/" 静态资源的路径
-->
<mvc:resources mapping="/img/**" location="/img/"></mvc:resources>

(2)方式二 常用:

spring-mvc.xml

 <!--配置tomcat默认的静态资源处理-->
    <mvc:default-servlet-handler/>

(3)方式三:

web.xml

<servlet-mapping>
    <servlet-name>DispatcherServlet</servlet-name>
    <!--
        自定义一个不会与默认的tomcat冲突的拦截规则
        配置:*.do 之后
        什么情况下才会被sprignMVC框架所拦截????
        浏览器访问的资源需要加上:/user/quick.do
        所以静态  123.png  my.js my.css a.html 这些就不会被springMVC框架拦截,也就不会出现404的问题了...
    -->
    <url-pattern>*.do</url-pattern>
</servlet-mapping>

 

spring-mvc.xml文件配置:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="
        http://www.springframework.org/schema/beans
		http://www.springframework.org/schema/beans/spring-beans.xsd
		 http://www.springframework.org/schema/aop
		http://www.springframework.org/schema/aop/spring-aop.xsd
		http://www.springframework.org/schema/mvc
		http://www.springframework.org/schema/mvc/spring-mvc.xsd
		 http://www.springframework.org/schema/tx
		http://www.springframework.org/schema/tx/spring-tx.xsd
        http://www.springframework.org/schema/context
		http://www.springframework.org/schema/context/spring-context.xsd">

    <!--开启注解组件扫描-->
    <context:component-scan base-package="com.wsl.web"/>



    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/pages/"></property>
        <property name="suffix" value=".jsp"></property>
    </bean>



    <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
        <property name="maxUploadSize" value="5024000"></property>
    </bean>

    <!--开启mvc注解支持-->
    <mvc:annotation-driven conversion-service="conversionService"></mvc:annotation-driven>
    <!--扩展自定义类型转换器-->
    <bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">
        <property name="converters">
            <set>
                <bean class="com.wsl.web.DateConverter"></bean>
            </set>
        </property>
    </bean>

    <!--<mvc:resources mapping="/image/**" location="/image/"></mvc:resources>-->

<!--<mvc:default-servlet-handler></mvc:default-servlet-handler>-->

</beans>

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章