GVKun编程网logo

spring @ModelAttribute @SessionAttributes数据访问模型...(spring数据访问层)

22

本文将带您了解关于spring@ModelAttribute@SessionAttributes数据访问模型...的新内容,同时我们还将为您解释spring数据访问层的相关知识,另外,我们还将为您提供

本文将带您了解关于spring @ModelAttribute @SessionAttributes数据访问模型...的新内容,同时我们还将为您解释spring数据访问层的相关知识,另外,我们还将为您提供关于3.11、@SessionAttribute 和 @RequestAttribute、@ModelAttribute注解和SpringMVC表单modelAttribute属性、@SessionAttributes 和 @SessionAttribute的区别、asp.net-web-api-405使用AttributeRouting.PUTAttribute,除非我还包含HttpPutAttribute的实用信息。

本文目录一览:

spring @ModelAttribute @SessionAttributes数据访问模型...(spring数据访问层)

spring @ModelAttribute @SessionAttributes数据访问模型...(spring数据访问层)

记录几个springMVC中容易混淆的注解合格几个常用的获取表单(json数据)的参数
@RequestMapping(value = "index1/{id}",method= RequestMethod.GET)
    public String index1(@PathVariable Integer id,Model model ){
        System.out.println("id:"+id);
//        ModelAndView modelAndView=new ModelAndView();
        List<Integer> list=new ArrayList<Integer>();
        for (int i=0;i<10;i++){
            list.add(i);
        }
        model.addAttribute("list",list);
        return "/test/test";
    }

    @RequestMapping(value = "index",method= RequestMethod.POST)
    @ResponseBody//返回的数据自动转化为json数据
    public Map<String, Object> index(HttpServletRequest request, @RequestParam(value = "username",required = false) String username ){
//        @PathVariable Integer mm       @RequestParam

        System.out.println("username:"+username);
//        System.out.println(request.getAttribute("password"));
        Map<String, Object> modelMap = new HashMap<String, Object>();
        modelMap.put("msg", 1);

       return modelMap;
    }
    /**
     * 测试model
     * @return
     */
    @RequestMapping("index")
    public String index(Model model){
        User user=new User();
        user.setUsername("chenlei");
        user.setPassword("123456");
        model.addAttribute(user);
        return "test/index";
    }
    /**
     * 测试model
     * @return
     */
    @RequestMapping(value = "index/form",method = RequestMethod.POST)
    public ModelAndView index(@RequestBody User user,Model model){
        System.out.println("用户名:"+user.getUsername()+"密码:"+user.getPassword());
//        user.setUsername(user.getUsername());
//        model.addAttribute(user);    ok

        ModelAndView modelAndView=new ModelAndView();
//        addObject( java.lang.Object attributeValue);
//        addObject(java.lang.String attributeName, java.lang.Object attributeValue)
        modelAndView.addObject("msg","okoko");
        modelAndView.setViewName("test/index");
        return modelAndView;
    }

    //方法仅处理request Content-Type为“application/json”类型的请求。
    @RequestMapping(value = "index4",method = RequestMethod.POST)
    @ResponseBody
    public Map<String, Object> index4(HttpEntity<User> entity){
        User user =entity.getBody();
        System.out.println("用户名:"+user.getUsername()+"密码:"+user.getPassword());
        Map<String, Object> modelMap = new HashMap<String, Object>();
        modelMap.put("msg", "json send ok!");
        return modelMap;
    }

 @Service 用于标注业务层组件,@Controller用于标注控制层组件(如struts中的action,@Repository用于标注数据访问组件,即DAO组件

@Controller
@RequestMapping("/user")
@SessionAttributes(“user”)
public class UserController {              
                   @ModelAttribute("user")//

该方法会往隐含模型中添加一个名为user的模型属性

public User getUser(){ User user = new User(); return user; } @RequestMapping(value = "/handle71") public String handle71(@ModelAttribute(“user”) User user){ ... } @RequestMapping(value = "/handle72") public String handle72(ModelMap modelMap,SessionStatus sessionStatus){ ... } }



使用一:

@RequestMapping(value = "/handle61")
public String  handle61(@ModelAttribute("user") User user){
	user.setUserId("1000");
	return "/user/createSuccess";
}

使用2:

访问UserController中任何一个请求处理方法前,Spring MVC先执行该方法,并将返回值以user为键添加到模型中

在此,模型数据会赋给User的入参,然后再根据HTTP请求消息进一步填充覆盖user对象

@ModelAttribute("user")
public User getUser(){
	User user = new User();
	user.setUserId("1001"); 
	return user;
}

@RequestMapping(value = "/handle62")
public String  handle62(@ModelAttribute("user") User user){
	user.setUserName("tom");
	return "/user/showUser";
}
@Controller
@RequestMapping("/user")
@SessionAttributes(“user”)①
public class UserController {
	
	@RequestMapping(value = "/handle71")
	public String  handle71(@ModelAttribute(“user”) User user){②//自动保存在session
		user.setUserName("John");
		return "redirect:/user/handle72.html";
	}
	
	@RequestMapping(value = "/handle72")
	public String  handle72(ModelMap modelMap,SessionStatus sessionStatus){
		User user = (User)modelMap.get(“user”);③//读取模型数据
		if(user != null){
			user.setUserName("Jetty");
			sessionStatus.setComplete();④	//清除处理器对应的会话属性
		}
		return "/user/showUser";
	}		
}

3.11、@SessionAttribute 和 @RequestAttribute

3.11、@SessionAttribute 和 @RequestAttribute

  本篇示例见这个项目的 mvc 分支下的 SesAndReqAttrController.java


① 使用@SessionAttribute来访问预先存在的全局会话属性

  如果你需要访问预先存在的、以全局方式管理的会话属性的话,比如在控制器之外(比如通过过滤器)可能或不可能存在在一个方法参数上使用注解@SessionAttribute

    /**
     * 在处理请求 /helloWorld/jump 的时候,会在会话中添加一个 sessionStr 属性。
     * <p/>
     * 这里可以通过@SessionAttribute 获取到
     */
    @RequestMapping("/sesAttr")
    public String handleSessionAttr(@SessionAttribute(value = "sessionStr") String sessionStr, Model model)
    {
        System.out.println("--> sessionStr : " + sessionStr);
        model.addAttribute("sth", sessionStr);
        return "/examples/targets/test1";
    }

  为了使用这些需要添加或移除会话属性的情况,考虑注入org.springframework.web.context.request.WebRequestjavax.servlet.http.HttpSession到一个控制器方法中。

  对于暂存在会话中的用作控制器工作流一部分的模型属性,要像“使用 @SessionAttributes 存储模型属性到请求共享的HTTP会话”一节中描述的那样使用SessionAttributes。

② 使用@RequestAttribute访问请求属性

  就像@SessionAttribute一样,注解@RequestAttribute可以被用于访问由过滤器或拦截器创建的、预先存在的请求属性:

    @RequestMapping("/reqAttr")
    public String handle(@RequestAttribute("reqStr") String str, Model model)
    {
        System.out.println("--> reqStr : " + str);
        model.addAttribute("sth", str);
        return "/examples/targets/test1";
    }

  可以使用下面的过滤器进行测试:

@WebFilter(filterName = "myFilter", description = "测试过滤器", urlPatterns = { "/*" })
public class MyFilter implements Filter
{
    
    @Override
    public void init(FilterConfig filterConfig) throws ServletException
    {}
    
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException
    {
        System.out.println("--> MyFilter Do.");
        request.setAttribute("reqStr", "万万没想到,啦啦啦啦啦!");
        
        chain.doFilter(request, response);
        
    }
    
    @Override
    public void destroy()
    {}
    
}

@ModelAttribute注解和SpringMVC表单modelAttribute属性

@ModelAttribute注解和SpringMVC表单modelAttribute属性

@ModelAttribute注解

1.没有添加@ModelAttribute修饰的方法,在目标方法的参数对实体进行入参,该实体默认会从ModelMap中获取,如果不存在则创建新的对象作为入参参数。在进行数据绑定的时候(doBinder()方法),会将该实体放入到ModelMap中。

2.添加@ModelAttribute修饰的方法,在每个目标方法调用前都会执行该方法。

一般情况下,在form表单修改的时,某项字段规定为不可更改,就需要使用该注解标注的方法,根据id的获取与否,来从数据库中获取对应的实体,然后存放到ModelMap中。

SpringMVC表单ModelAttribute属性

使用SpringMVC表单标签,必须要在request中有一个和表单对应的bean。默认request的键为command。可以通过修改form标签的modelAttribute属性修改键的值。

@SessionAttribute注解和@ModelAttribute注解冲突:

没有使用@ModelAttribute修饰的方法,且在某个目标方法入参使用了@SessionAttribute注解value同名的实体对象,会抛出异常。

原因:

if (implicitModel.containsKey(name)) {
    bindObject = implicitModel.get(name);
} else if (this.methodResolver.isSessionAttribute(name, paramType)) {
    bindObject = this.sessionAttributeStore.retrieveAttribute(webRequest, name);
    if (bindObject == null) {
    raiseSessionRequiredException("Session attribute ''" + name + "'' required - not found in session");
    }
}
在绑定参数前,此时Model中没有值,然后会进入另一个分支,就会抛出异常。

解决办法:

1.@SesionAttribute和方法入参处使用不同名的value值

2.添加@ModelAttribute修饰的方法,方法内将实体放入ModelMap中。


@SessionAttributes 和 @SessionAttribute的区别

@SessionAttributes 和 @SessionAttribute的区别

@SessionAttributes 和 @SessionAttribute的区别

Spring MVC中有两个长得非常像的注解:@SessionAttributes 和 @SessionAttribute。

我们先看下@SessionAttributes的定义:

@SessionAttributes用于在请求之间的HTTP Servlet会话中存储model属性。它是类型级别的注解,用于声明特定控制器使用的会话属性。这通常列出应透明地存储在会话中以供后续访问请求的模型属性的名称或模型属性的类型。

举个例子:

@SessionAttributes("user")
public class LoginController {

@ModelAttribute("user")
public User setUpUserForm() {
return new User();
}
}

我们可以看到@SessionAttributes是类注解,他用来在session中存储model。如上面的例子,我们定义了一个名为“User”的model并把它存储在Session中。

我们再看一下@SessionAttribute的定义:

如果您需要访问全局存在(例如,在控制器外部(例如,通过过滤器)管理)并且可能存在或可能不存在的预先存在的会话属性,则可以在方法参数上使用@SessionAttribute注释,例如 以下示例显示:

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

/*
* Get user from session attribute
*/

@GetMapping("/info")
public String userInfo(@SessionAttribute("user") User user) {

System.out.println("Email: " + user.getEmail());
System.out.println("First Name: " + user.getFname());

return "user";
}
}

@SessionAttribute只是获取存储在session中的属性。如果要设置(添加删除)session的属性,则要考虑将org.springframework.web.context.request.WebRequest或javax.servlet.http.HttpSession注入到控制器方法中。

@SessionAttributes中绑定的model可以通过如下几个途径获取:

  • 在视图中通过request.getAttribute或session.getAttribute获取

  • 在后面请求返回的视图中通过session.getAttribute或者从model中获取

  • 自动将参数设置到后面请求所对应处理器的Model类型参数或者有@ModelAttribute注释的参数里面。

@SessionAttributes用户后可以调用SessionStatus.setComplete来清除,这个方法只是清除SessionAttribute里的参数,而不会应用Session中的参数。

@Controller
@SessionAttributes("pet")
public class EditPetForm {

// ...

@PostMapping("/pets/{id}")
public String handle(Pet pet, BindingResult errors, SessionStatus status) {
if (errors.hasErrors) {
// ...
}
status.setComplete();
// ...
}
}
}

总结一下:

@SessionAttributes 是将model设置到session中去。

@SessionAttribute 是从session获取之前设置到session中的数据。

更多教程请参考 flydean的博客


本文分享自微信公众号 - 程序那些事(flydean-tech)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

asp.net-web-api-405使用AttributeRouting.PUTAttribute,除非我还包含HttpPutAttribute

asp.net-web-api-405使用AttributeRouting.PUTAttribute,除非我还包含HttpPutAttribute

我有一个MVC项目,我试图更新以包括WebApi.为了获得所需的路由,我们使用AttributeRouting.除了返回405的[PUT]之外,所有调用似乎都正确路由.我已经简化了控制器和操作,并且仍然使用[PUT]接收错误,除非我也包含[HttpPut].不确定我错过了什么.

[RoutePrefix("api/Sites")]
    public class SitesController : BaseApiController
    {
        [POST("")]
        public bool CreateSite(SiteSignupArgs args)
        {
            ...
        }

        [GET("Statuses")]
        public IList<SiteAuditviewmodel> GetStatuses()
        {
            ...
        }

        [PUT("Statuses/{siteId}")]
        [HttpPut] // This is required or 405 is returned 
        public HttpResponseMessage UpdateStatus(string siteId,UpdateStatusArgs args)
        {
            ...
        }

        [DELETE("Statuses/{siteId}")]
        public HttpResponseMessage Delete(string siteId)
        {
            return Request.CreateResponse(HttpStatusCode.OK);
        }
}

AttributeRouting.Core 3.5.6版,AttributeRouting.Core.Http,AttributeRouting.Core.Web,AttributeRouting.WebApi

MVC4

未安装WebDAV.

解决方法

你所看到的是预期的行为.如果操作名称没有带有“Get”,“Post”,“Put”,“Delete”等动词的前缀,则Web API中的Action Selector默认假定操作为动词POST.

现在,即使您明确指定了[PUT(“Statuses / {siteId}”)]属性,它也无法工作,因为,Action选择器从System.Web.Http命名空间中查找属性,如HttpGetAttribute,HttpPostAttribute,HttpPutAttribute等.

由于AttributeRouting的PUTAttribute不属于上述类型,因此Action选择器不会考虑它,仍然认为它是默认的,即POST.因此,使用HttpPut属性的解决方法是正确的.

今天关于spring @ModelAttribute @SessionAttributes数据访问模型...spring数据访问层的讲解已经结束,谢谢您的阅读,如果想了解更多关于3.11、@SessionAttribute 和 @RequestAttribute、@ModelAttribute注解和SpringMVC表单modelAttribute属性、@SessionAttributes 和 @SessionAttribute的区别、asp.net-web-api-405使用AttributeRouting.PUTAttribute,除非我还包含HttpPutAttribute的相关知识,请在本站搜索。

本文标签:

上一篇Python 模块学习 - logging(python的logging模块)

下一篇BLOCK_TYPE_US_VALID(pHead->nBlockUse)