发表于: 2017-09-20 23:17:23
1 609
今天完成的事情:修改了代码 目的是为了引入样式js css文件以及png jpg文件
这里注意 我是把js css 文件放在了webapp下 而png jpg文件放在了WEB-INF下面
也就是说如果把jsp文件放在这下面 那么直接在地址栏输入路径是无法访问的 因为这样属于客户端的请求
当然我们都是不使用这种方法访问的 因为会暴露出实际路径 在controller里面对路径进行匹配再根据视图解析器的配置
跳转到相应的界面 这样就是由服务端来进行分发的
然后 这里实际上我们常常会碰到两个问题 但是往往容易混合在一起
第一个是无法访问静态资源的问题 也就是无法引入js css png
第二个是无法访问 WEB-INF下的文件
因为我们可能会把静态资源放在 WEB-INF下 所以这两个问题常常混为一谈
首先看下为什么无法访问静态资源 因为我们是以下的配置
<servlet-mapping>
<servlet-name>mvc-dispatcher</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
把所有的请求都交给springmvc去处理了,而所有available的请求url都是在Controller里使用类似@RequestMapping(value = "/login}", method = RequestMethod.GET)这样的注解配置的
首先我们看下servlet容器对url的匹配过程
当一个请求发送到servlet容器的时候,容器先会将请求的url减去当前应用上下文的路径作为servlet的映射url,比如我访问的是 http://localhost/test/aaa.html,我的应用上下文是test,容器会将http://localhost/test去掉, 剩下的/aaa.html部分拿来做servlet的映射匹配。这个映射匹配过程是有顺序的(按照servlet-mapping在web.xml中声明的先后顺序),而且当有一个servlet匹配成功以后,就不会去理会剩下 的servlet了(filter不同,将符合条件都进行过滤)。
而web.xml中如果某个Servlet的映射路径仅仅为一个正斜杠(/),那么这个Servlet就成为当前Web应用程序的缺省Servlet。在web.xml文件中找不到匹配的元素的URL,它们的访问请求都将交给缺省Servlet处理,也就是说,缺省Servlet用于处理所有其他Servlet都不处理的访问请求。
所以我们这里对静态资源的访问是因为当请求的url和web上面其他的均不匹配时,则会交给mvc-dispatcher.Java处理,而不在交给DefaultServlet.java处理,也就是说,当请求web应用中的静态资源等时,则全部进入了mvc-dispatcher.java,而不会正常返回页面资源。最后都会交给这个默认servlet
<url-pattern>/</url-pattern> 会匹配到/login这样的路径型url,不会匹配到模式为*.jsp这样的后缀型url
<url-pattern>/*</url-pattern> 会匹配所有url:路径型的和后缀型的url(包括/login,*.jsp,*.js和*.html等)
所以根据这一点我们直接在web。xml里面 设置转给tomcat等容器自行注册的servlet能匹配相关文件就可以
servlet-mapping>
<servlet-name>mvc-dispatcher</servlet-name>
<url-pattern>*.css</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.js</url-pattern>
</servlet-mapping>
这里注意不是所有容器默认都是default
在spring3.0.4以后版本提供了mvc:resources
这种方法实际上十分的强大
<mvc:resources mapping="/images/**" location="/images/" />
他实际上把前面的映射到了后面的地址 能够映射任何
两个*,它表示映射resources/下所有的URL,包括子路径(即接多个/)
当然也可以使用后缀的方式
<mvc:resources mapping="/*.css" location="/images/" />
报错WARNING: No mapping found for HTTP request with URI [/mvc/user/findUser/lisi/770] in DispatcherServlet with name 'springMVC'
使用的原理:使用 <mvc:resources/> 元素,把 mapping 的 URI 注册到 SimpleUrlHandlerMapping的urlMap 中,key 为 mapping 的 URI pattern值,而value为 ResourceHttpRequestHandler,这样就巧妙的把对静态资源的访问由 HandlerMapping 转到ResourceHttpRequestHandler 处理并返回,所以就支持 classpath 目录, jar 包内静态资源的访问.
但是他有个问题 无法访问到WEB-INF下的静态资源 需要把他们放在WEB-INF外面
网上有的说这两个不能混用 但是我实际上混合使用了
然后原来访问首页是根据
<welcome-file-list>
<welcome-file>/WEB-INF/snippets/home.jsp</welcome-file>
<welcome-file>inde.html</welcome-file>
<welcome-file>inde.htm</welcome-file>
</welcome-file-list>
来访问相关文件的 现在我想根据路径来访问 使用tiles
实际上webxml加上
<welcome-file-list>
<welcome-file>home</welcome-file>
</welcome-file-list>
<servlet-mapping>
<servlet-name>mvc-dispatcher</servlet-name>
<url-pattern>/home</url-pattern>
</servlet-mapping>
以及controller
@RequestMapping(value = "/home")
public String index() {
return "home";
}
这样首页自动跳转到了/home返回的home 也就是tiles里面定义的相关页面了
<definition name="home" extends="base_page" >
<put-attribute name="body" value="/WEB-INF/snippets/home.jsp" />
</definition>
明天计划的事情:总结任务五 继续优化代码
遇到的问题:使用<mvc:default-servlet-handler/>无法访问WEB-INF下文件 无法成功跳转首页 页面变得很小
按住CTRL 使用滑轮能调整页面比例
收获:以上
任务开始时间:9.15
预计完成时间:9.20
是否有延期风险:延期两天
禅道链接:http://task.ptteng.com/zentao/my-task.html
评论