1.1springmvc web框架
SpringMVC是一种基于Java,实现了Web MVC设计模式,请求驱动类型的轻量级Web框架,将Web层进行职责解耦,继承httpServlet,封装扩展了servlet,开发效率比一般servlet高,但一般servlet性能好。
spring体系下的:springmvcheima1/WebContent/WEB-INF/lib/spring-webmvc-4.1.3.RELEASE.jar
用途:接收浏览器的请求响应,对数据进行处理,然后返回页面进行显示。
1.2
构成:四大器,即前端控制器,处理器适配器,处理器映射器,视图解析器。
作用流程:
1、 用户发送请求至前端控制器DispatcherServlet
2、 DispatcherServlet收到请求调用HandlerMapping处理器映射器。
3、 处理器映射器根据请求url找到具体的处理器,生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet。
4、 DispatcherServlet通过HandlerAdapter处理器适配器调用处理器
5、 执行处理器(Controller,也叫后端控制器)。
6、 Controller执行完成返回ModelAndView
7、 HandlerAdapter将controller执行结果ModelAndView返回给DispatcherServlet
8、 DispatcherServlet将ModelAndView传给ViewReslover视图解析器
9、 ViewReslover解析后返回具体View
10、 DispatcherServlet对View进行渲染视图(即将模型数据填充至视图中)。
11、 DispatcherServlet响应用户
2.1搭建环境
导包:
创建web-xml----------->创建springmvc.xml------->视图jsp---------->pojo---------->编写controller
web.xml tomcat启动加载web-xml,再加载springmvc.xml继续加载
3.1 web.xml
springmvcheima1
index.html
index.htm
index.jsp
default.html
default.htm
default.jsp
spirngMvcheima1
org.springframework.web.servlet.DispatcherServlet
contextConfigLocation
classpath:SpringMvc.xml
1
spirngMvcheima1
*.action
springmvc.xml
controller
@Controller
public class ItemsController {
//静态模拟
//指定url到请求方法的映射
//url中输入一个地址,找到这个方法.例如:localhost:8080/springmvcheima1/list.action
@RequestMapping("/list")
public ModelAndView itemsList() throws Exception{
List itemList = new ArrayList<>();
//商品列表
Items items_1 = new Items();
items_1.setName("联想笔记本_3");
items_1.setPrice(6000);
items_1.setDetail("联想笔记本电脑!");
Items items_2 = new Items();
items_2.setName("苹果手机");
items_2.setPrice(5000f);
items_2.setDetail("苹果手机!");
itemList.add(items_1);
itemList.add(items_2);
//模型和视图
//model模型: 模型对象中存放了返回给页面的数据
//view视图: 视图对象中指定了返回的页面的位置
ModelAndView modelAndView = new ModelAndView();
//将返回给页面的数据放入模型和视图对象中
modelAndView.addObject("itemList", itemList);
//指定返回的页面位置
modelAndView.setViewName("itemList");
//视图中用 ${item.name } ${item.price }
return modelAndView;
}
4.1注解开发
@Controller @RequestMapping @ModelAttribute @SessionAttributes @PathVariable @RequestParam
@ResponseBody @RequestBody
@Controller
Controller处理由DispatcherServlet分发的请求,主要流程为:Controller调用业务处理层处理后封装成一个model,该注解标记到一个类上,说明是一个控制器类。
@RequestMapping
处理请求地址的映射,可以用在类或者方法中,这样访问的地址就得加上本注解的值,属性有value,method 等。
@RequestMapping ( "/test/{variable1}" )
public class MyController {
@RequestMapping ( "/showView/{variable2}" )
public ModelAndView showView( @PathVariable String variable1, @PathVariable ( "variable2" )
@ModelAttribute
两种方式:一种标注在方法上,一种标注到方法参数上
该注解的方法会先执行,把返回的对象存在session或者模型属性中,如模型属性(ModelAttribute("attributeName")),若未指定,返回的是类名称(首字母小写)作为属性名称,再执行真正请求的方法
@ModelAttribute("tmodel")
public TModel t(){
TModel t = new TModel();t.setEmail("dfdafdasf");
return t;
}
@RequestMapping("item")
public TModel t(){
TModel t = new TModel();t.setEmail("dfdafdasf");
return t;
}
@ModelAttribute单独在方法上使用,同时结合@ModelAttribute使用在形参上
@ModelAttribute("tmodel")
public TModel t(){
TModel t = new TModel();t.setEmail("dfdafdasf1");
return t;
}
@RequestMapping(value = "/activity_view2", method = RequestMethod.GET)
public String f3(@ModelAttribute("tmodel") TModel email){
return "migucactivites/migucactivites_config";
}
这种情况下,根据debug,也是在requestmapping处理完毕以后,才真正写入到session中的。
但是,这里spring Mvc做了处理,在形参处,可以获取到在t方法中设置的tmodel值。虽然此时session中其实没有这个内容。
@SessionAttributes
@SessionAttributes只能使用在类定义上。
若希望在多个请求之间共用某个模型属性数据,则可以在
控制器类上标注一个 @SessionAttributes, Spring MVC
将在模型中对应的属性暂存到 HttpSession 中
@SessionAttributes(value={"names"},types={Integer.class})
@Controller
public class Test {
@RequestMapping("/test")
public String test(Map map){
map.put("names", Arrays.asList("caoyc","zhh","cjx"));
map.put("age", 18);
return "hello";
}
}
两者一起用:
@Controller
@RequestMapping(value = "/migucactivites")
@SessionAttributes("tmodel")
public class MigucActivityController {
@RequestMapping(value = "/activity_view2", method = RequestMethod.GET)
public String f3(@ModelAttribute("tmodel") TModel email){
return "migucactivites/migucactivites_config";
}
}
这种情况下,@ModelAttribute一定会去session中找对应的tmodel对象。如果找不到,就会报错,请求在后台直接抛出异常。
如果session中有tmodel对象,传入连接中没有传入email字段,则email直接得到的是session中值,并且会把值再set回model中,并放到session中。
如果session中有tmodel对象,并且传入参数也有email值。例如url:http://127.0.0.1:8081/migucactivites/activity_view2.htm?email=2d,这种情况下,代码email的值为2d,并且也会把tmodel=2d放到model中,放到session中
@PathVariable
@RequestParam
@pathVariable("pageSize") 需要配合rest风格url使用,目的是接收rest Url中的参数 http://127.0.0.1:8082/hello/4
@RequestParam((value = "pageSize", required = false, defaultValue = "10")) 接收普通?后面携带的参数 http://127.0.0.1:8082/hello?pageSize=4
@RequestMapping(value = "/hello/{pageSize}", method = RequestMethod.GET)
public String say(@PathVariable("pageSize") String pageSize) {
return pageSize;
}
@RequestMapping(value = "/hello", method = RequestMethod.GET)
public String say2(@RequestParam(value = "pageSize", required = false, defaultValue = "10") String pageSize) {
return pageSize;
}
@ResponseBody
@RequestBody
//请求json串(商品信息),输出json(商品信息)
//@RequestBody将请求的商品信息的json串转成itemsCustom对象
//@ResponseBody将itemsCustom转成json输出
@RequestMapping("/requestJson")
public @ResponseBody ItemsCustom requestJson(@RequestBody ItemsCustom itemsCustom){
//@ResponseBody将itemsCustom转成json输出
return itemsCustom;
}
//请求key/value,输出json
@RequestMapping("/responseJson")
public @ResponseBody ItemsCustom responseJson(ItemsCustom itemsCustom){
//@ResponseBody将itemsCustom转成json输出
return itemsCustom;
}
@RequestHeader
@CookieValue
可以把Request请求header部分的值绑定到方法的参数上。
5.1参数绑定
意思:把客服端传过来的数据如key/value的数据,绑定到controller中方法的形参上,则此过程名为参数绑定。
适配器中注入参数绑定。
1:默认支持的参数绑定类型:
HttpServletRequest HttpServletResponse HttpSession Modelj接口 ModelMap实现类.
直接在controller的方法参数上加入HttpServletRequest对象,用途将前端传过来的数据封装到域中.
public ModelAndView queryItems(Model model)
如model.addAttribute("user", user);
:2:简单参数绑定:
在springmvc方法中不用传入的参数名称和方法参数名称一致,可以用@RequestParam来绑定简单类型参数,如果不用此注解,则必须一致。
传入参数和形参一致的情况:
@RequestMapping("/updateitem1")
//没用request.getParameter(id);都可以获取到传入的值。
public String update1(Integer id, String name, Float price, String detail) throws Exception {
Items items = new Items();
items.setId(id);
items.setName(name);
items.setPrice(price);
items.setDetail(detail);
itemsService.updateItems(items);
return "success";
}
jsp: