springmvc小结(上)
1.springmvc的整体结构以及流程
①.前端控制器:只需要在web.xml文件中配置即可
作用:接受请求,处理响应结果,转发器,中央处理器
②.处理器映射器:根据请求的url找到相应的Handler
③.处理器适配器:调用处理器Handler/controller的方法
④.处理器Handler(Controller)后端控制器,接受用户请求的数据,调用业务方法处理请求
⑤.视图解析器ViewResolver:视图解析,把逻辑视图转换为真正的物理视图
⑥.视图View:把数据展现给用户
2.默认的注解
在不进行配置的的时候有默认配置的在此文件中,默认进行配置。
# Default implementation classes for DispatcherServlet's strategy interfaces. # Used as fallback when no matching beans are found in the DispatcherServlet context. # Not meant to be customized by application developers. org.springframework.web.servlet.LocaleResolver=org.springframework.web.servlet.i18n.AcceptHeaderLocaleResolver org.springframework.web.servlet.ThemeResolver=org.springframework.web.servlet.theme.FixedThemeResolver org.springframework.web.servlet.HandlerMapping=org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping,\ org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping org.springframework.web.servlet.HandlerAdapter=org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter,\ org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter,\ org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter org.springframework.web.servlet.HandlerExceptionResolver=org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerExceptionResolver,\ org.springframework.web.servlet.mvc.annotation.ResponseStatusExceptionResolver,\ org.springframework.web.servlet.mvc.support.DefaultHandlerExceptionResolver org.springframework.web.servlet.RequestToViewNameTranslator=org.springframework.web.servlet.view.DefaultRequestToViewNameTranslator org.springframework.web.servlet.ViewResolver=org.springframework.web.servlet.view.InternalResourceViewResolver org.springframework.web.servlet.FlashMapManager=org.springframework.web.servlet.support.SessionFlashMapManager
3.<mvc:annotation-driven>
默认是:基于注解映射器和基于注解的适配器
支持类型转换ConversionService
@NumberFormat,DateTimeFormate
@Validdate,JSR303校验
@RequestBody,@ResponseBody
4.@RequestMapping
用来处理请求地址(URL)映射的注解,可以在类或者方法上面
如果在类上就代表所有的请求方法URL都必须有类上的URL地址作为父路径
属性:
①.value和path一样,指定请求的URL
method:指定请求的不同方式:GET,POST,PUT,DELETE....
②.指定请求和响应的MedlaType
consumes:指定请求内容格式:Content-Type=application/json
produces:指定响应内容格式:application/json;charset=UTF-8
③.
params:指定request中必须包含某些参数值,包含方法处理
handlers:指定request中必须包含指定的header,包含才能处理
同时还可以窄化请求映射:即把其写在类上面
@RequestMapping("/user") public class user{ @RequestMapping("/login") public String login(){ ... } }
5.前端控制器url-pattern
前端控制器的配置:
①. * .扩展名,比如*.action,不会导致静态的资源文件被拦截的问题。但是不支持RESTFULL风格的编码 ②. / 支持RESTFull风格,但是会导致静态的资源文件被拦截 ③./* ,错误的方式,可以请求到Controller方法,但是跳转到JSP时会被拦截,JSP不能正常显示
②. / 支持RESTFull风格,但是会导致静态的资源文件被拦截
解决方法:
1.在项目总的web.xml文件
<servlet-mapping> <servlet-name>default</servlet-name> <url-pattern> *.jsp</url-pattern> <servlet-mapping> ... jsp png
2.使用mvc中的标签
在springmvc.xml文件中
<!--处理默认的静态资源的文件请求 -->
<mvc:default-servlet-handler/>
3.资源映射
<!--资源映射 --> <mvc:resources location="" mapping=“” />
6.请求和响应
1.响应处理:
①.返回为void
@RequestMapping("/test1") public void test1(HttpServletRequest req,HttpServletResponse resp) throws ServletException, IOException{ //请求转发 req.getRequestDispatcher("").forward(req, resp); //请求的重定向 resp.sendRedirect(""); //设置共享数据 req.setAttribute("", ""); //输出json resp.setContentType("text/json;charset=utf-8"); resp.getWriter().append(""); }
//返回为void文件下载 @RequestMapping("/test2") public void test2(OutputStream out) throws IOException{ Files.copy(Paths.get("D:/Photo/bg.jpg"), out); }
②.返回ModelAndView
@RequestMapping("/test3") public ModelAndView test3(){ ModelAndView mv = new ModelAndView(); mv.setViewName("/WEB-INF/views/test.jsp"); //设置共享的数据的key和value mv.addObject("msg", "test3...."); //设置共享数据的value,此时会把value类型的首字母小写作为key key=string mv.addObject("只有值的共享数据"); return mv; }
③.返回String
//返回String //需要结合Model进行结合使用 @RequestMapping("/test4") public String test4(Model model){ model.addAttribute("msg", "return string"); return "test"; }
2.请求跳转
①.请求转发
//请求转发 //浏览器的地址不变还可以共享数据 @RequestMapping("/test5") public String test5(Model model){ model.addAttribute("msg", "请求转发"); return "forward:/index.jsp"; }
②.URL重定向
地址栏改变,数据不能共享
//重定向
@RequestMapping("/test6")
public String test6(Model model){
model.addAttribute("msg", "请求重定向");
return "redirect:/index.jsp";
}
note: Flash属性,只能使用从contrlooer 重定向到controller,不能到jsp
3.请求参数处理
①.数组
//数组的形式 //接受一个参数有多个值得情况 @RequestMapping("/test4") public void test4(Long [] ids){ System.out.println(Arrays.asList(ids)); }
②.pojo
@RequestMapping("/test4") public void test4(User user){ System.out.println(Arrays.asList(user)); }