今日心得
SpringMVC
Web层的MVC框架
基础步骤
- 创建web项目
- 编写xml.web,在其中注册一个特殊的servlet,前端控制器
- 编写 一个spring-mvc的配置文件
- 注册一个视图的解析器
- 编写控制器
- 编写结果页面
SpringMVC分析
流程图
组件分析
-
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类型的返回值
因此:
一家人整整齐齐
在model当中填充数据,然后再具体的视图进行展示
在传统的的controller中,还需要在配置文件当中配置一下这个bean,要取个name,这个名字就用来充当了请求的URI。
<!-- 注册HelloController-->
<bean class="zoe.controller.HelloController" name="/helloController">
</bean>
SpringMVC注解开发模式
上述的基于接口的方式已经是过去式
基本注解:
- @Controller
- @RequestMapping
步骤
- 配置注解扫描包
- 在指定的类下面添加@Controller注解
- 添加@requestMapping注解,类似之前的controller的那个名字,不同的是requesthander处理
当我们写上Controller之后,就标记了它为spring的一个组件,并且是控制器的组件,此时我们的handerMapping会去扫描寻找这个controller是否与之匹配,如果匹配,就把处理的工作交给它。
-
匹配的规则:具体的匹配就是通过请求的路径进行匹配的。
@requestMapping(URI)
此时就是通过这个URI进行匹配
-
@requestMapping可以写在方法上,也可以写在类上。
这里的路径就应该是/bye/bye