SpringMVCDay05
-
创建一个表单,将客户端传过来的多个数据封装到一个集合里面(前提是客户端传过来的名字和List集合里面的对象的属性名字一致,才会自动帮你封装)
-
第一步:创建一个表单jsp
<form action="${pageContext.request.contextPath}/user/quick15" method="post"> //表单提交地址 <input name="userList[0].username" type="text" placeholder="请输入你的用户名"><br> <input name="userList[0].age" type="text" placeholder="年龄"><br> <input name="userList[1].username" type="text" placeholder="请输入你的用户名"><br> <input name="userList[1].age" type="text" placeholder="年龄"><br> <input type="submit" value="登录"><br>
-
第二步:在pojo包下编写一个List集合的类,(提供set get方法)
private List<User> userList;
-
第三步:在 Controller类中编写代码测试
@Controller @RequestMapping("/user") public class UserController { @RequestMapping("/quick15") @ResponseBody public void save11(Vo vo){ System.out.println(vo); }
-
-
使用ajax,在ajax中将 对象转换成json字符串转发到服务器,这样就不需要自己创建一个集合类来封装,只需要将你想创建的集合 写进参数就行,注意在前面加一个@RequestBoby注解
-
第一步:导入jquery-1.7.2.js
-
第二步,在spring-mvc配置,不然无法成功加载jquery-1.7.2.js
<mvc:resources mapping="/static/**" location="/static/"></mvc:resources>
-
第三步:编写一个jsp程序
<script type="text/javascript" src="${pageContext.request.contextPath}/static/jquery-1.7.2.js"></script> <script> var userList = new Array(); userList.push({username:"张三",age:19}); userList.push({username:"李四",age:30}); /*采用ajax*/ $.ajax({ type:"Post", url:"${pageContext.request.contextPath}/user/quick17", data:JSON.stringify(userList), contentType:"application/json; charset=UTF-8" }); </script>
-
第四步:编写程序测试
@RequestMapping("/quick17") @ResponseBody public void save13(@RequestBody List<User> userList)throws IOException { System.out.println("quick启动"); System.out.println(userList); }
为什么要在spring-mvc配置
因为我们采用了前端控制器,这些资源都是由前端控制器帮你找,他一开始都跑去Controller这个类里面找@RequestMapping()这个路径, 但是你的jquery又不是路径,所以找不到,我们就加上了,表示开放static下面的,statuc目录下的权限, 如果要开放多个,在下面继续加
<!--开放对哪些资源的访问权限--> <mvc:resources mapping="/static/**" location="/static/"></mvc:resources> <mvc:resources mapping="/img/**" location="/img/"></mvc:resources> <!--上面还可以写成下面(表示,如果前端控制器找不到对应资源,就交给tomcat服务器找)--> <mvc:default-servlet-handler></mvc:default-servlet-handler>
-
解决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>
客户端发来的请求名字与参数名字对应不上
-
客户端发来的请求名字与参数名字对应不上,那么就不会给参数赋值,但是如果我们加了@RequestParm注解,那么 就可以将传过来的值的名字和注解里面的名字对比,如果相同,就可以将值赋给参数 注意!加了这个注解之后,你在传过来参数名字的值,那么不会赋值,一句话:加了这个注解传过来的值的名只能跟注解里的名相同
@RequestMapping("/quick18") @ResponseBody public void save14(@RequestParam(value="name" ,required = false,defaultValue ="张政" ) String username)throws IOException{ //客户端如果发来的参数名字是username的话,就会自动帮你将username 的value赋给参数username //但是如果发来的值的名字和参数名不一样,就会输入null 匹配不上 于是我们加上@RequestParam注解 即使名字匹配不上, // 只要发来的参数名字和这个注解的名字一样,那也可以 将值赋给参数 但是注意加了这个注解之后,你在传入来username,那么与name对应不上就报错 System.out.println(username); }
required 表示:值对不上就报错,默认为true,可以手动改为false,不报错, defaultValue表示,你传过来的值对不上,那么就默认输出张政
url占位符
@RequestMapping("/quick19/{name}")
-
{name}表示占位符, 出现在url地址中 http://localhost:8080/spring_test/user/quick19/%E5%BC%A0%E4%B8%89
@RequestMapping("/quick19/{name}") @ResponseBody //将url携带的占位符的名与@PathVariable注解进行匹配,值相同,则将占位符的值赋给name,name在赋值给username public void save15(@PathVariable(value="sname" ,required = false) String username)throws IOException { System.out.println("quick启动"); System.out.println(username); // }
将url携带的占位符的名与@PathVariable注解进行匹配,值相同,则将占位符的值赋给name,name在赋值给username ,required的作用跟上面一样, 这里 username和前面的注解的名字可以一样,也可以不一样,但是占位符的名和注解的名字必须一样
自己配置一个Date转换器
-
浏览器只能支持1999/11/11 这样的模式,不支持1999-11-11 所以我们自己顶一个时间转换器
-
第一步:先创建一个DateConteter类去继承Conterter
public class DateConverter implements Converter<String,Date> { public Date convert(String dateStr) { //这里来经行日期的转换 SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd"); Date date=null; try { date = format.parse(dateStr); System.out.println(date); } catch (ParseException e) { e.printStackTrace(); } return date; }
-
第二步:去spring-mvc.xml文件配置,告诉自带的转换器,你的转换你
<!--配置Date转换器--> <bean id="conversionServiceFactory" class="org.springframework.context.support.ConversionServiceFactoryBean"> <property name="converters"> <list> <bean class="com.itheima.converter.DateConverter"></bean> </list> </property> </bean> <!--mvc的注解驱动 这样以来上面的配置处理器映射适配器就不用写了--> <mvc:annotation-driven conversion-service="conversionServiceFactory"/>
注意! 这里要将你 的转换器的id传给驱动, 而且! 必须是在驱动前面写, 不然你驱动都注册了,还没扫描到你的转换器就会报错
-
第三步:测试
@RequestMapping("/quick20") @ResponseBody //将url携带的占位符的名与@PathVariable注解进行匹配,值相同,则将占位符的值赋给name,name在赋值给username public void save16(Date date) throws IOException { //通过我们自定义的日期转换器来打印 System.out.println(date); // }
-
获取请求头和cookie
-
@CookieValue和@RequestHeader注解
@RequestMapping("/quick22") @ResponseBody //将url携带的占位符的名与@PathVariable注解进行匹配,值相同,则将占位符的值赋给name,name在赋值给username public void save18(@CookieValue(value="JSESSIONID") String jseeeionid) throws IOException { //通过我们自定义的日期转换器来打印 System.out.println(jseeeionid); // } @RequestMapping("/quick21") @ResponseBody //将url携带的占位符的名与@PathVariable注解进行匹配,值相同,则将占位符的值赋给name,name在赋值给username public void save17(@RequestHeader(value="User-Agent") String user_age) throws IOException { //通过我们自定义的日期转换器来打印 System.out.println(user_age); // }
文件上传
-
文件上传客户端的三要数
-
type=file
-
method=post
-
表单的enctype属性是多部份表单形式,enctype=“multipart/form-data”
-
-
第一步:先导入坐标
<dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-annotations</artifactId> <version>2.9.0</version> </dependency> <dependency> <groupId>commons-fileupload</groupId> <artifactId>commons-fileupload</artifactId> <version>1.2</version> </dependency> <dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId> <version>1.4</version> </dependency>
-
第二步,在spring-mvc.xml文件配置 文件下载(注意这里的id存在而且必须是multipartResolver)
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> <property name="maxUploadSize" value="50000"></property> <property name="defaultEncoding" value="UTF-8"></property> </bean>
-
第三步,编写文件测试
@RequestMapping("/xjj") @ResponseBody public void save13(String username, MultipartFile uploadFile){ System.out.println(username); System.out.println(uploadFile); }
-
第四步:保存文件
//将上传的文件保存到你想要去的地址 String originalFilename = uploadFile.getOriginalFilename(); //这一步是获取你上传的文件的文件名字 try { uploadFile.transferTo(new File("D:\\app\\Test\\"+originalFilename)); } catch (IOException e) { e.printStackTrace(); }
-
第五步:多文件上报保存(上述表单多加一个文件上传)
<form action="${pageContext.request.contextPath}/user/quick13" method="post" enctype="multipart/form-data"> 用户名 <input type="text" name="username" ><br> 上传文件<input type="file" name="uploadFile" ><br> 上传文件<input type="file" name="uploadFile2" ><br> <input type="submit" value="提交" ><br> </form>
-
代码阶段
public void save13(String username, MultipartFile uploadFile,MultipartFile uploadFile2){ System.out.println(username); System.out.println(uploadFile); //将上传的文件保存到你想要去的地址 String originalFilename = uploadFile.getOriginalFilename(); //这一步是获取你上传的文件的文件名字 String originalFilename2 = uploadFile2.getOriginalFilename(); //这一步是获取你上传的文件的文件名字 try { uploadFile.transferTo(new File("D:\\app\\Test\\"+originalFilename)); uploadFile2.transferTo(new File("D:\\app\\Test\\"+originalFilename2)); } catch (IOException e) { e.printStackTrace(); } }