发表于: 2017-08-22 22:15:12
1 1160
今天完成的事情:
想着深入理解一下SpringMVC的各种标签之类,于是各种查
过滤器HiddenHttpMethodFilter
浏览器不支持put,delete等method,由该filter将/xxx?_method=delete转换为标准的http delete方法
<filter>
<filter-name>hiddenHttpMethodFilter</filter-name>
<filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>hiddenHttpMethodFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
@RequestParam 来映射请求参数
value 值即请求参数的参数名
required 该参数是否必须,默认是true
defaultValue 请求参数的默认值
@RequestMapping(value="/testRequestParam")
public String testRequestParam(@RequestParam(value="username")String un,@RequestParam(value="age",required=false,defaultValue="0")int age){
System.out.println("testRequestParam,username:"+un+",age:"+age);
retun "success"}
就是可以不请求参数,然后返回0
@RequestHeader 映射请求头信息,用法同上
使用POJO对象绑定请求参数值
SpringMVC会按请求参数名和POJO属性名进行自动匹配,自动为该独享填充属性值,支持级联属性(就是关联的pojo)。
@RequestMapping("/pojo")
public String pojo(User user){
System.out.println()
return "success}
直接转发页面,在servlet里面配
<mvc:view-controller path="/success" view-name="success"/>
可以直接响应转发的页面,而无需再经过handler的方法,但是正常的跳转就不好用了额
在实际开发中,通常都需要配置mvc:annotation-driven标签
redirect:success.jsp,会完成一个到success.jsp的重定向的操作
forward:success.jsp,会完成一个到success.jsp的转发操作
重定向和转发
一般情况下,控制器方法返回字符串类型的值会被当成逻辑视图名处理
如果返回的字符串中带forward:或redirect:前缀时,SpringMVC会对他们进行特殊处理,将forward:和redirect:当成指示符,其后的字符串作为URL来处理
处理静态资源
优雅的REST风格的资源URL不希望带.html或.do等后缀
若将DispatcherServlet请求映射配置为/,则SpringMVC将捕获WEB容器的所有请求,包括静态资源的请求,SpringMVC会将它们当成一个普通请求处理,因找不到对应处理器将导致错误。
可以在SpringMVC的配置文件中配置<mvc:default-servlet-handler/>的方式解决静态资源的问题
处理模型数据
ModelAndView
SpringMVC会把ModelAndView的model中数据放入到request域对象中
@RequestMapping("/testModelAndView")
public ModelAndView testModelAndView(){
String viewName="success";
ModelAndView modelAndView=new ModelAndView(viewName);
//添加模型数据到ModelAndView中
modelAndView.addObject("time",new Date());//键值对,放到请求域里面
return modelAndView;}
在jsp页面可以写time:${requestScope.time}打印当前时间
Map及Model
SpringMVC在内部使用了一个org.springframework.ui.Model接口存储模型数据
具体步骤:“
SpringMVC在调用方法前会创建一个隐含的模型对象作为模型数据的存储容器。
如果方法的入参为Map或Model或ModelMap类型,SpringMVC会将隐含模型的引用传递给这些入参。在方法体内,开发者可以通过这个入参对象访问到模型中的所有数据,也可以向模型中添加新的属性数据
@RequestMapping("/testMap")
public String testMap(Map<String,Object>map){
map.put("name",Arrays.asList("Tom","Jerry","Mike"));
return "success";}
在jsp页面写names:${requestScope.names}
@SessionAttributes
若希望在多个请求之间共用某个模型属性数据,则可以在控制器类上标注一个@SessionAttributes,SpringMVC将在模型中对应的属性暂存在HTTPSession中。
@SessionAttributes除了可以通过属性名指定需要放到会话中的属性外,还可以通过模型属性的对象类型指定哪些模型属性需要放到会话中
@SessionAttributes(types=User.class)会将隐含模型中所有类型为User.class的属性添加到会话中。
@SessionAttributes(value={"user1","user2"})
@SessionAttributes(types={User.class,Dept.class})
@SessionAttributes(value={"user1","user2"}),types=(Dept.class)
@ModelAttribute
应用场景就是数据库中有四个值,都取出来但是密码不要修改,只修改另外三个。而且有@ModelAttribute标注的的方法,会在每个目标方法执行之前被调用
@ModelAttribute
public void getUser(@RequestParam(value="id",required=false)Integer id,
Map<String,Object>map){
if(id!=null){
User user=new User(1,"Tom","123456","tom@qq.com",12);
Syetem.out.println("从数据库中获取一个对象:"+user);
map.put("user",user);}}
@RequestMapping("/testModelAttribute")
public String testModelAttribute(User user){
System.out.println("修改:"+user);
return "success";}
在jsp页面不用提交密码也可以生成出有原来密码的对象
运行流程
1、执行@ModelAttribute注解修饰的方法:从数据库中出去对象,把对象放入到Map中,键为:user
2、SpringMVC从Map中取出User对象,并把表单的请求参数赋给该User对象的对应属性
3、SpringMVC把上述对象转入目标方法的参数
注意:在@ModelAttribute修饰的方法中,放入到Map时的键需要和目标方法入参类型的第一个字母小写的字符串一致。
继续写昨天CRUD,改了一下list.jsp
<c:if test="${empty requestScope.students}">
没有任何学生信息
</c:if>
<c:if test="${!empty requestScope.students}">
<table border="1" cellpadding="10" cellspacing="0">
<tr>
<th>name</th>
<th>qq</th>
<th>type</th>
<th>time</th>
<th>school</th>
<th>number</th>
<th>link</th>
<th>hope</th>
<th>referrer</th>
<th>from_where</th>
<th>id</th>
<th>create_at</th>
<th>update_at</th>
</tr>
<c:forEach items="${requestScope.students}" var="emp">
<tr>
<td>${emp.name}</td>
<td>${emp.qq}</td>
<td>${emp.type}</td>
<td>${emp.time}</td>
<td>${emp.school}</td>
<td>${emp.number}</td>
<td>${emp.link}</td>
<td>${emp.hope}</td>
<td>${emp.referrer}</td>
<td>${emp.from_where}</td>
<td>${emp.id}</td>
<td>${emp.create_at}</td>
<td>${emp.update_at}</td>
<td><a href="emp/${emp.id}">Delete</a></td>
</tr>
</c:forEach>
</table>
</c:if>
然后GET方法是好用的
再post方法,提交,id是自增就不写了
也没问题了
删除
@RequestMapping(value = "/emp/{id}",method = RequestMethod.DELETE)
public String delete(@PathVariable("id") Integer id){
studentService.studyDelete(id);
return "redirect:/emps";
}
我看了是用过滤器的方法把put、delete转化之后再用正常的delete删除
<form action="" method="post">
<input type="hidden" name="_method" value="DELETE">
</form>
然后就用postman试一下
底下都是白屏,然后数据库的东西也没删
用网页试一下
额,这关GET什么事。。需要多试验一下
改良了一会,把花里胡哨的都删了,把过滤器也关了
说我input页面有问题,不对啊,这个是增加界面,测试是没问题的,怎么删除操作会跳到这里。。
明天计划的事情:
put和delete还是没弄懂,继续。然后又发现了一个jQuery,想学一下
遇到的问题;
delete和put怎么实现的还是没弄懂,应该还有别的方法
收获:
springMVC很多标签还有概念的理解,form表单也学了一下,挺复杂的。最后post成功了,delete还是没弄好
禅道:http://task.ptteng.com/zentao/project-task-286.html
评论