springMVC常用基本方法

springmvc常用的跳转方法 和注解的使用方法  记录一下  为自己不争气的记忆力 做点回顾

/**作者 :Li shilin 

* @date 创建时间:2017年11月16日 上午10:24:16 
* @type 类说明:
*/
@SessionAttributes(value = {"user"},types= {String.class})
@RequestMapping("/springmvcTest")
@Controller
public class SpringmvcTest {

private static final String SUCCESS = "success";

/**
* 重定向的方法使用
* @return
*/
@RequestMapping("/testRedirect")
public String testRedirect() {
System.out.println("testRedirect");
return "redirect:/index.jsp";
}

/**
* 转到自定义视图
* @return
*/
@RequestMapping("/testView")
public String testView() {
System.out.println("testView");
return "helloViews";
}


@RequestMapping("/testViewAndViewResolver")
public String testViewAndViewResolver() {
System.out.println("testViewAndViewResolver");

return SUCCESS;
}



/**
* 有@ModelAttribute标记的方法,会在每个目标方法执行之前被springmvc调用
* 在执行其他方法时也会被执行

*/
@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", "1234567");
System.out.println("数据库中获取的对象:"+user);
map.put("user", user);
}
}

/**
*使用@ModelAttribute注解的运行流程
*1. 从数据库中取出对象,把对象放到map中 减为:user
*2.Springmvc从map中取出User对象,并把表单的请求参数赋给该User对象的属性
*3.springmvc 把上述的对象传入目标方法的参数
*
*注意:在@MOdelAttribute修饰的方法中,放入到Map中时的键需要和目标方法入参类型的第一个字母小写的字符串一致(就是和实体类的名称要一致 但是首字母要小写)
*
*Springmvc确定目标方法POJO类型参数的过程
*1.确定一个key:
*1).若目标方法的POJO类型的参数没有使用@ModelAttribute 作为修饰,则key为POJO类名第一个字母的小写
*2).若使用了@ModelAttribute来修饰 则key为@MOdelAttribute注解的value属性
*2.在implicitModel中查找key对应的对象,若存在,则作为参数传入
*1).若在@ModelAttribute标记的方法中在map中保存过,且key和1确定的key一致,则会获取到
*3.若implicitModel中存在key对应的对象,则检查当前的Handler 是否使用@SessionAttributes注解修饰
*若使用的该注解,且@SessionAttributes注解的value值中包含了key,则会从HTTPSession中获取key所对应的value值,若存在直接传入目标方法的参数中
*如果不存在就抛出异常
*4.若Headler没有标识@SessionAttributes 注解 或@SessionAttributes注解的value值中不包含key,则会通过反射来创建POJO类型的参数,传入
*为目标方法的参数
*5.SpringMVC会把key和POJO类型的对象保存在implicitModel中,进而会保存在request中。
*
*源码分析:
*1.调用@ModelAttribute 注解修饰的方法,实际上把@ModelAttribute方法中Map中的数据放在了implictModel中。
*2.解析请求处理器的目标参数,实际上该目标参数来自于WebDataBinder对象的target属性
*1).创建WebDataBinder对象:
*①.确定ObjectName属性:若传入的AttrName 属性值为"",则objectName为类名的第一个字母小写
**注意:attrName,若目标方法的POJO属性使用了@ModelAttribute来修饰,则attrName值即为@ModelAttribute的Value属性值
*
*②.确定target属性
*>在impliciModel中查找attrName 对应的属性值 ,若存在 ok
*>* 若不存在:则验证当前Handler 是否使用了@SessionAttrbutes进行修饰,若使用了,则尝试从session中获取attrName 对应的属性值
*,若session中没有对应的属性值,则抛出异常
*>若Hander没有使用@SessionAttrbutes进行修饰,或@SessionAttrbutes中没有使用value值指定的key和attrName相匹配,则通过反射创建了
*POJO
*
*2).SpringMvc把表单的求情参数赋给了WebDataBinder的target对应的属性.
*3).*springmvc会把WebDataBinder的attrName和target给到implicitModel,进而传到request域对象中
*4).把WebDataBinder的target作为参数传递给目标方法的入参
*
*/

@RequestMapping("/testModelAttribute")
public String testModelAttribute(User user) {
System.out.println("修改:"+user);
return SUCCESS;
}

/**
* @SessionAttributes 除了可以通过属性名指定需要放到回话中的属性外(实际上使用的是 value值的属性)
* 还可以通过模型属性的对象类型指定那些模型属性需要放到会话中(使用的是type值的属性值)
* * 这个注解只能放在类的上面 不能放在放法的上面

*/

@RequestMapping("/testSessionAttrbutes")
public String testSessionAttrbutes(Map<String, Object> map) {
User user  = new User("Toms","123456","45478454");
map.put("user", user);
map.put("school", "xinhau");

return SUCCESS;
}



/**
* requestmapping可以定义在类上面  也可以定义在方法上面
* @return
*/

@RequestMapping("/springmvc")
public String testRequestMapping() {
System.out.println("testRequestMapping");
return SUCCESS;
}

/**
* 使用method的方式来指定提交的方式是什么
* @return
*/
@RequestMapping(value = "/testmethod" , method = RequestMethod.POST)
public String testMethod() {
System.out.println("testMethod");
return SUCCESS;
}


/**
* 使用params 和headrs 来更加精确的映射表达,params 和 headrs支持简单的表达
* @return
*/

@RequestMapping(value ="/testParamsAndHeadrs" , params = {"username","age != 10"} ,headers = {"Accept-Language:zh-CN,zh;q=0.9"})
public String testParamsAndHeadrs() {

System.out.println("testParamsAndHeadrs");
return SUCCESS;
}

/**
* spring3.0之后支持 占位符注解
* @PathVariable 可以映射URL 中的占位符到目标方法的参数中
* @param id
* @return
*/
@RequestMapping("/testPathVariable/{id}")
public String testPathVariable(@PathVariable("id") Integer id) {
System.out.println(id);
return SUCCESS;
}
/**
* Rest 风格的URL
* 以CRUD为例:
* 新增: /order   post   
* 修改:/order/1  put    update?id=1
* 获取:/order/1  get get?id=1
* 删除:/order/1  DELETE delete?id=1

* 如何发送put和delete请求
* 1.需要配置HiddenHttpMethodFilter
* 2.需要发送POST请求
* 3.需要在发送Post请求是携带一个name="_method" 的隐藏域,值为DELETE或PUT

* 在springMVC的目标方法中得到id的方式是:@PathVariable注解



*/

@RequestMapping(value = "/testRest/{id}", method = RequestMethod.GET)
public String testRest(@PathVariable Integer id) {
System.out.println("TestRest GET:"+id);
return SUCCESS;
}

@RequestMapping(value = "/testRest", method = RequestMethod.POST)
public String testRest() {
System.out.println("TestRest post:");
return SUCCESS;
}


@RequestMapping(value = "/testRest/{id}", method = RequestMethod.DELETE)
public String testRestDelete(@PathVariable Integer id) {
System.out.println("TestRest DELETE:"+id);
return SUCCESS;
}

@RequestMapping(value = "/testRest/{id}", method = RequestMethod.PUT)
public String testRestPut(@PathVariable Integer id) {
System.out.println("TestRest PUT:"+id);
return SUCCESS;
}

/**
* @RequetParam 来映射请求参数
* value 值即请求的参数ming
* required 该参数是否必须,默认为true
* defaultValue 请求参数的默认值    这里一般不用写  接收的变量最好使用包装类 这样便利

*/

@RequestMapping(value = "/testRequestParam")
public String testRequestParam(@RequestParam(value = "username") String name, 
@RequestParam(value = "age" ,required = false) Integer age) {
System.out.println("testRequestParam, username="+name+",age="+age);
return SUCCESS;
}

/**
* 了解
* 映射请求头信息
* 用法:@RequestHeader

*/

@RequestMapping("/testRequestHeadrs")
public String testRequestHeadrs(@RequestHeader(value = "Accept-Language") String al) {
System.out.println("Accept-Language:"+al);
return SUCCESS;
}

/**
* @CookieValue
* 获取一个cookie值
* 用法 用法都是一样的
* */
@RequestMapping("/testCookeValue")
public String testCookeValue(@CookieValue("JSESSIONID") String sessionid) {
System.out.println("sessionid:"+sessionid);
return SUCCESS;
}


/**
* 用java的对象来提交数据 这样方便 
* 级联属性 :一个entity 用到另一个entity 提交的时候直接写原entity中的属性的在点另一个entity的属性
* @param user
* @return
*/
@RequestMapping("/testPOJO")
public String testPOJO(User user) {
System.out.println("testPOJO:"+user);
return SUCCESS;
}

/**
*可以使用servlet原生的API 作为目标方法的参数 具体支持的类型有:
*HttpServletRequest
*HttpServletResponse
*HttpSession
*java.security.Principal
*Locale   InputStream
*OutputStream
*Reader
*Writer 
* @throws IOException 
*/
@RequestMapping("/testServletApi")
public String testServletApi( HttpServletRequest request,HttpServletResponse response,Writer out) throws IOException {
System.out.println(request+","+response);
out.write("呵呵 这就是原生的servletApi");
return SUCCESS;
}

/**
* 目标方法的返回值可以是ModelAndView类型
* 其中包含视图和模型信息
* springMVC会把ModelAndView的model中的数据放入到request域对象中
* @return
*/
@RequestMapping("/testmodelAndview")
public ModelAndView testmodelAndview() {
String viewName = SUCCESS;
ModelAndView modelAndView = new ModelAndView(viewName);

//添加模型数据到modelAndview中
modelAndView.addObject("time", new Date());

return modelAndView;
}



}

猜你喜欢

转载自blog.csdn.net/qq_37531990/article/details/78737335