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
在spring3.1之前使用org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping注解映射器。
 
在spring3.1之后使用org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping注解映射器。
 
在spring3.1之前使用org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter注解适配器。
 
在spring3.1之后使用org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter注解适配器。

 

 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风格,但是会导致静态的资源文件被拦截
因为在tomcat文件中处理静态文件资源的servlet叫default,二default的映射路径就是    /.
 
启动项目的时候:
    1.启动Tomcat加载web.xml文件     /
    2.启动i项目时候 加载web.xml文件   /
 
项目中的web.xml文件覆盖了 Tomcat中的web.xml配置文件映射规则

解决方法:

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/>

 

将mvc上下文中定义一个DefaultServletHttpRequestHandler,对所有的前端控制器的请求组筛选和盘查,
如果发现没有经过映射请求,就交给Tomcat的默认servlet来处理

3.资源映射

<!--资源映射 -->
<mvc:resources  location=""   mapping=“”     />
自己来处理静态的资源,而且还多了很多的功能
方法2.是交给Servlet来处理

 

 

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.请求跳转

①.请求转发

原理:req.getRequestDispatcher("").forward(req, resp);
     //请求转发
     //浏览器的地址不变还可以共享数据
     @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));
     }
posted @ 2018-11-17 15:01  MrChengs  阅读(271)  评论(0编辑  收藏  举报