发表于: 2019-11-24 20:03:50

1 979


学习springmvc

需求:发出一个hello.form请求,显示/WEB-INF/下的hello.jsp页面

WEB-INF是web应用的安全目录,web-inf文件夹在正常情况下系统是不允许外界直接访问的,因为有些页面需要接收信息显示,只是一个模板,如果直接访问就只有模板信息而没有处理结果的数据信息,但是系统可以自身进行访问,所有要使系统去访问的话就需要使用拦截控制器去接受外界命令,由控制器来转发访问请求,当然如果JSP不放在安全目录中,也可以加一个过滤器阻止对某些jsp的直接访问

建立一个业务控制器HelloController来转发请求

客户端发出一个form请求,这个请求要经过DispatcherServlet这个前置控制器,DispatcherServlet配置在web.xml文件中

拦截匹配的请求,Servlet拦截匹配规则要自己定义,把拦截下来的请求,依据相应的规则分发到目标Controller来处理,分析web.xml

<?xml version="1.0" encoding="UTF-8"?>

<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"

         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"

         version="4.0">

    <context-param>

        <param-name>contextConfigLocation</param-name>

        <param-value>/WEB-INF/applicationContext.xml</param-value>

    </context-param>

    <listener>

        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>

    </listener>

    <servlet>

        <servlet-name>dispatcher</servlet-name>

        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>

        <load-on-startup>1</load-on-startup>

    </servlet>

    <servlet-mapping>

        <servlet-name>dispatcher</servlet-name>

        <url-pattern>*.form</url-pattern>

    </servlet-mapping>

</web-app>

<context-param>

        <param-name>contextConfigLocation</param-name>

        <param-value>/WEB-INF/applicationContext.xml</param-value>

    </context-param>

web 容器 ( 比如tomcat ) 会先读取 web.xml 文件中的两个节点listener 和 context-param,接着容器会创建一个 ServletContext 对象 (也就是 servlet上下文 ), 这个 web 项目的所有部分都将共享这个上下文。我理解的是,在context-param节点中设值applicationContext.xml,那么web容器就可以使用Spring配置的组件了

<servlet>

        <servlet-name>dispatcher</servlet-name>

        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>

        <load-on-startup>1</load-on-startup>

    </servlet>

    <servlet-mapping>

        <servlet-name>dispatcher</servlet-name>

        <url-pattern>*.form</url-pattern>

    </servlet-mapping>

设置Servlet拦截匹配规则,拦截下来.form请求,将请求分发给相应的Controller业务控制器处理,那么经过DispatcherServlet拦截下来的请求如何分发呢?此时就需要用到HanderMapping组件了,HanderMapping有四种映射处理器,其原理一样,只是实现方式不同,映射就是将请求名和Controller对应起来,现在使用较简单的一种,使用注解来映射寻找controller, 

DefaultAnnotationHandlerMapping,步骤是: 

1.开启注解扫描组件 

2.在类上标记:@Controller 声明该类是一个springMVC Controller 

3.在方法上使用:@RequestMapping() 声明该方法处理哪一个请求 

先在applicationContext.xml开启注解扫描

<context:component-scan base-package="com.hnust.springmvc"/>

在applicationContext.xml添加标签

<mvc:annotation-driven />

简写模式,相当于在xml文件中定义了HanderMapping和其他一些Bean组件,定义了这个简写的标签,才能在Controller方法中使用 @RequestMapping注解来实现请求的处理。(自动提示有四个,选用:xmlns:mvc=”http://www.springframework.org/schema/mvc”)


通过开启组件扫描,Controller组件中被RequestMapping标记的方法就可以处理该请求,这样,就建立起了请求名和Controller组件的对应关系。虽然看不到HanderMapping的组件代码,因为框架已经提供了它的实现,可以通过注解直接使用就行。

标记的方法返回一个hello字符串,表明请求调用hello相关视图,如何找到视图呢,这时候需要使用到ViewResolver视图解析器组件了。

在Spring容器applicationContext.xml定义ViewResolver组件

<!--定义ViewResolver-->

 <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">

    <property name="prefix" value="/WEB-INF/"/>

    <property name="suffix" value=".jsp"/>

 </bean>

ViewResolver组件接收HelloController处理的结果,也就是”hello”字符串,然后在添加定义的前缀和后缀信息,形成了”/WEB-INF/hello.jsp”完整的视图文件路径,生成响应结果,由web容器解析,在客户端显示。 
hello.jsp代码:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>

<html>

<head>

    <title>Test</title>

</head>

<body>

    Hello Spring web MVC

</body>

</html>

部署:

出现错误:

org.apache.tomcat.util.descriptor.web.WebXml.setVersion Unknown version string [4.0]. Default version will be used.

 [RMI TCP Connection(2)-127.0.0.1] org.apache.catalina.core.StandardContext.startInternal One or more listeners failed to start. Full details will be found in the appropriate container log file

 [RMI TCP Connection(2)-127.0.0.1] org.apache.catalina.core.StandardContext.startInternal Context [/swmtest] startup failed due to previous errors

解决办法:

效果

后续再写增删改查 

明天计划:整理任务一的深度思考 完善这个项目的其他功能 继续学习springmvc 






返回列表 返回列表
评论

    分享到