SpringMVC学习笔记(一)

SpringMVC学习笔记(一)

这篇笔记主要记录我在学习SpringMVC时遇到的一些问题和我觉得需要记录的一些重要的知识点。如有错误,敬请指正。下面开始正文:

(1)知识点部分

1、前端控制器DispatcherServlet和控制器Controllers

在web.xml中对其进行配置,一般将其url-pattern设置为/,这样DispatcherServlet会截获所有请求,如图:

<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>/</url-pattern>
    </servlet-mapping>

前段控制器截获请求后,通过查询handler-mapping分发给相应的Controller去处理,具体实现非常简单,只需要在配置文件中启用组件扫描,然后在我们编写的Controller类上进行一点注释即可,代码如下:
在dispatcher-servlet.xml文件中,增加一行代码,:

<context:component-scan base-package="Controllers"/>

这行代码的作用是启用Spring内置的组件扫描功能,base-packege指定了被扫描的包名,所有在这个包下的类都会被扫描。接下来需要在Controller类上增加注释来使它被识别为控制器,代码如下:

package Controllers;
import ...

@Controller
@RequestMapping({"/Ayo","/home","/hompage","/"})
public class HomeController {
    @RequestMapping( method =GET )
    public String home(){
        return "home";
    }
}

a、 @Controller注释表明这个类是一个控制器,如果spring对Contorllers包启动了组件扫描,那么HomeController类会被spring扫描并注册为一个控制器组件。
b、 @RequestMapping注释有两个属性valuemethod,value=请求的url,method=请求的方式。其中method属性可有可无,但value属性通常必须配置,否则Controller类不会处理任何请求。@RequestMapping注释可以添加在类层面也可以添加在方法层面,如果同时在类上和类的方法上添加该注释,并且两个注释都包含了value属性,那么spring会将两个value的值进行字符串拼接,形成一个新的url,代表方法所处理的请求的url。
c、 @RequestMapping属性的value属性还可以接受多个url值,即同时匹配多个url。
d、 Controller的返回值为String类型时,这个返回值会被交给视图解析器处理,在之后我会详细说明它的原理,这里我们只需要知道它返回的是一个视图名(通常不包含后缀名)就行了。

2、视图解析器viewResolver

前面说到,Controller返回一个String类型的值,由视图解析器来处理这个返回值,那么我们需要在dispathcer-servlet.xml文件中手动来配置视图解析器,一个很经典的方案如下:

<!-- 视图解析器 -->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="viewResolver">
        <property name="prefix" value="/WEB-INF/views/"></property>
        <property name="suffix" value=".jsp"></property>
        <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"></property>
    </bean>

我们可以看到上面的代码注册了一个idviewResolver的bean,类名为InternalResourceViewResolver(内部资源视图解析器)。当然你也可以更换其它类来充当视图解析器,spring也提供了很多的内置视图解析器类,但我在项目中使用的视图大部分是jsp,因此我选择了InternalResourceViewResolver
在我的项目中,我给它配置了三条属性,其中prefixsuffix属性分别指定了前缀和后缀,其作用就是将Controller返回的字符串前后分别拼接上前缀和后缀,从而形成一个完整的资源名称。比如HomeController返回了"home",viewResolver给它加上前缀"/WEB-INF/views/“和后缀”.jsp",得到了"/WEB-INF/views/home.jsp"。没错,这就是最终所得到的视图的物理位置,viewResolver会按照这个地址去寻找名为hoem.jsp的文件,解析这个视图,并将结果渲染到response中,之后的事情就不用说了,浏览器接收到response,渲染出一个html页面。
你可能会问,那第三个属性viewClass是干嘛用的呢?这并不重要,但如果你需要在jsp中使用JSTL标签,那么你就要在视图解析器的配置里加上一行,也就是配置viewClass属性。上面的代码将viewClass设置为JstlView,这意味着视图解析器将会把视图解析为JstlView,如果你不进行这行配置,并且在jsp中使用JSTL标签,那就很可能会产生jsp错误。

(2)问题部分

1、使用JSTL标签库

我希望在jsp中使用一些能给我带来方便的标签,但它们都依赖于一个第三方标签库,也就是JSTL标签库。所以我需要将JSTL标签库导入我的项目中。具体步骤可以去菜鸟教程查看,有一个需要注意的小问题,就是导入标签库之后,你还需要在web.xml中配置每一个tld,将它们的物理位置和uri绑定。如果你要将所有的tld注册,那么web.xml文件将会增加很长一段代码,它会变得很难看。但实际上你并不需要这么做,只要将你会用到的几个标签注册到web.xml中就行了。

2、JSP可以外部引用CSS吗?(静态资源的放行)

答案是绝对可以,只不过SpringMVC配置有前端控制器,而我又将url-pattern设置为/,这意味着所有请求,包括对静态资源的请求都会被dispatcherServlet拦截,那么如果我在jsp文件中引用了一个CSS,如:

<link rel="stylesheet" type="text/css" href="/Resources/CSS/css1.css">

那么当解析视图时,视图解析器去请求css1.css文件,dispatcherServlet截获了这个请求,一查handler-mapping,诶,没有handler(Controller)能处理这个url的请求啊,于是这次请求就失败了,视图解析器没有得到CSS文件,也就无法使用CSS来渲染视图了,最终看到的就是没有按照CSS渲染成的视图。
所以,为了使静态资源能够被放行,我们需要在dispathcer-servlet.xml中增加两项配置,样例代码如下:

<mvc:annotation-driven/>
<mvc:resources mapping="/Resources/**" location="/Resources/"/>

第一条配置<mvc:annotaion-driven />,非常重要,如果没有它的话,第二条配置resources将会阻止任何控制器被调用。<mvc:resources />的mapping属性为请求的url,location属性为资源的物理地址详细参考文章

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值