发表于: 2017-08-22 22:15:12

1 1161


今天完成的事情:

想着深入理解一下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







返回列表 返回列表
评论

    分享到