2019.7.12

2019/7/23 19:34:33 人评论 次浏览 分类:学习教程

文章目录

  • 今日心得
    • SpringMVC
      • 基础步骤
      • SpringMVC分析
        • 流程图
        • 组件分析
        • 关于前端控制器的解释
        • springmvc配置文件名字问题
        • 视图解析器
        • 控制器的解释
      • SpringMVC注解开发模式
        • 步骤

今日心得

SpringMVC

Web层的MVC框架

基础步骤

  1. 创建web项目
  2. 编写xml.web,在其中注册一个特殊的servlet,前端控制器
  3. 编写 一个spring-mvc的配置文件
    • 注册一个视图的解析器
  4. 编写控制器
  5. 编写结果页面

SpringMVC分析

流程图

mark

组件分析

  • web.xml注册前端控制器,目的在于,希望让springmvc去处理所有请求,通过一下代码实现:

    	<!--  servlet映射配置  -->
    	<servlet-mapping>
    		<servlet-name>springmvc</servlet-name>
        	<!-- 统一写斜杠-->
            <url-pattern>/</url-pattern>
        </servlet-mapping>
    

    确实是处理过所有请求(不是所有请求)

    url-pattern写法问题:

    • / :处理所有请求,但是和/*不一样,他处理完之后要出道曲的时候不会再去将这个person.jsp当做一个新的请求,将这个熏染的结构直接返回给浏览器。
    • /*: (永远不要这么写,原因在于,我们请求/hellocontroller过去的时候,他的视图名称是people.jsp页面,它把他当做一个了一个people.jsp的请求,尝试去匹配对应的controller,但是我们的容器当中没有样的controller,导致404,这种做法似乎是之前在用J2EE的时候用过)
    • *.do:(这种方式,是有的团队习惯请求的行为加个小尾巴来区分 *.action等)

    完整代码:

    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xmlns="http://java.sun.com/xml/ns/javaee"
             xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
             version="2.5">
    <!--  注册一个前端控制器
          DispatcherServlet
    -->
      <servlet>
        <!--这里的springmvc是有讲究的
        如果我们不去修改springmvc配置文件的默认位置,那么springmvc
        它会去WEB-INF下面找一个叫做springmvc-servlet.xml的文件
        -->
        <servlet-name>springmvc</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
      </servlet>
    
        <!--servlet映射配置  -->
        <servlet-mapping>
            <servlet-name>springmvc</servlet-name>
        <!-- 统一写斜杠-->
            <url-pattern>/</url-pattern>
        </servlet-mapping>
    
    </web-app>
    
    
  • springmvc-servlet.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
    
        <!--配置一个视图解析器
        常用内部资源视图解析器InternalResourceViewResolver
        -->
        <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <!-- InternalResourceViewResolver需要配置前缀和后缀-->
    	<!-- 前缀-->
            <property name="prefix" value="/jsp/"/>
    
    	<!-- 后缀-->
            <property name="suffix" value=".jsp"/>
        </bean>
    
    	<!-- 注册HelloController-->
        <bean class="zoe.controller.HelloController" name="/helloController">
    
        </bean>
    </beans>
    
  • 控制器代码

    package zoe.controller;
    
    import org.springframework.web.servlet.ModelAndView;
    import org.springframework.web.servlet.mvc.Controller;
    
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    //实现一个controller接口方式
    public class HelloController implements Controller {
        @Override
        public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {
            ModelAndView mav = new ModelAndView();
            mav.addObject("people","特朗普");
            mav.setViewName("people");
            return mav;
        }
    }
    
  • 视图—>采用jsp,虽然现在基本不用了,但是还是跟着流程走一下

    <%--
      Created by IntelliJ IDEA.
      User: huangkaiwen
      Date: 2019/7/12
      Time: 12:28
      To change this template use File | Settings | File Templates.
    --%>
    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
        <title>Title</title>
    </head>
    <body>
        姓名:${people}
    </body>
    </html>
    
    

关于前端控制器的解释

springmvc设计的理念是希望开发者尽量远离原生的servletAPI,因为原生的API不好用,很繁琐,将操作进一步及那话,它将很多东西责任进行了拆分,不希望我们将一些技术点绑死,可以做到随意的切换。不是说servlet没有用,本身还是servlet(DispatcherServlet)

springmvc配置文件名字问题

默认情况下是使用dispatcherServlet的名字当做命名空间

[servletName]-servlet.xml(WEB-INF)下面寻找

[servletName]-servlet=namespace

  • 当配置文件需要取另外一个名字,不是springmvc的时候,并且在默认情况下,就会搜索不到springmvc-servlet.xml,此时我们就需要再初始化修改参数此时配置文件还是在WEB-INF下面
<init-param>
          <param-name>namespace</param-name>
          <param-value>spring-mvc</param-value>
</init-param>
  • 当配置文件不再WEB-INF下面,而是在resources下面的时候,就需要重新定制上下文配置文件即可。此时是在类路径下面寻找spring-mvc.xml这个配置文件
<!--      上下文配置的位置指定-->
	<init-param>
         <param-name>contextConfigLocation</param-name>
         <param-value>classpath:spring-mvc.xml</param-value>
     </init-param>
</servlet>

视图解析器

springmvc-支持多种视图技术

  • jsp
  • freemaker(模板技术)、

内部资源解析器

  • 视图前缀
    • /jsp/ :其实它是我们的请求响应的资源的路径配置,在controller里面有个 viewName :person,此时会补充路径==/jsp/person/==
  • 视图后缀
    • .jsp :此时我们的前缀+视图名称+后缀就是最后的路径 /jsp/person.jsp

物理视图由逻辑视图转换而来

物理视图是:WEB-INF/jsp/person.jsp

逻辑视图是:

  • prefix
  • logicViewName
  • suffix

物理View = prefix + logicVeiwName + suffix

控制器的解释

是一种比较传统的实现一个接口的方式完成的,Controller。

如果一个接口只有一个方法,那么称之为函数式接口

下面是Controller的接口:

@Nullable
ModelAndView handleRequest(HttpServletRequest var1, HttpServletResponse var2) throws Exception;

这个接口就像是servlet的doGet和doPost里面的入参的请求与相应。

但是servlet是void没有返回值的,这里的是ModelAndView类型的返回值

因此:

mark

一家人整整齐齐

在model当中填充数据,然后再具体的视图进行展示

在传统的的controller中,还需要在配置文件当中配置一下这个bean,要取个name,这个名字就用来充当了请求的URI。

	<!-- 注册HelloController-->
    <bean class="zoe.controller.HelloController" name="/helloController">
    </bean>

SpringMVC注解开发模式

上述的基于接口的方式已经是过去式

基本注解:

  • @Controller
  • @RequestMapping

步骤

  1. 配置注解扫描包
  2. 在指定的类下面添加@Controller注解
  3. 添加@requestMapping注解,类似之前的controller的那个名字,不同的是requesthander处理

当我们写上Controller之后,就标记了它为spring的一个组件,并且是控制器的组件,此时我们的handerMapping会去扫描寻找这个controller是否与之匹配,如果匹配,就把处理的工作交给它。

  • 匹配的规则:具体的匹配就是通过请求的路径进行匹配的。

    @requestMapping(URI)

    此时就是通过这个URI进行匹配

  • @requestMapping可以写在方法上,也可以写在类上。

mark

这里的路径就应该是/bye/bye

mark

相关资讯

    暂无相关的资讯...

共有访客发表了评论 网友评论

验证码: 看不清楚?
    -->