第一章 SpringMVC概述
1.1
1.2 SpringMVC第一个程序
/02-primary-SpringMVC2
先提出一个问题:WEB-INF下放的jsp文件和WebContent下方的jsp文件有什么区别?
在WEB-INF下放的资源,是不能通过浏览器直接访问的,比较安全,只能是后台服务端的程序进行跳转过去的,也就意味着重定向时不能重定向到WEB-INF下。
注册处理器 限制请求为.do这种形式 注意有/斜杠
web.xml注册中央调度器
1、全限定性类名
该中央调度器为一个Servlet,名称为DispatcherServlet。它的全限定性类名在org.springframework.web.servlet下可找到。
2、load-on-startup
在servlet中添加<load-on-startup的作用是,标记是否在Web服务器(这里是Tomcat)启动时会创建这个Servlet实例,即是否在Web服务器启动时调用执行该Servlet的init()方法,而不是在真正访问时才创建。这样提高效率。
这个数大于等于0时,就表示在容器启动时就加载并初始化这个servlet,数值越小,该servlet优先级越高,创建的也就越早。
如果小于0或未指定,表示该servlet在真正访问时才创建。
当值相同,容器自己选择创建顺序。
3、url-pattern
不能写为/*,最好也不写为/,建议写为*.do
的形式。使用后缀名模式。
4、配置文件位置与名称
其实和之前整合spring和mybatis中应用的一样,将springMVC.xml文件在web中注册。即指定SpringMVC配置文件的位置及文件名。
5、指定index.jsp为欢迎页面
<?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" id="WebApp_ID" version="2.5">
<display-name>01-primary-SpringMVC</display-name>
<!-- 注册中央调度器 -->
<servlet>
<servlet-name>springMVC</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 指定SpringMVC配置文件的位置及文件名 -->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc.xml</param-value>
</init-param>
<!-- 原来是执行.do,才创建,效率低。现在表示Tomcat在启动时,直接创建当前Servlet(把DispatcherServlet这个对象给创建了),大于0就行 -->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springMVC</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>
定义处理器
需要实现Controller接口。
ModelAndView类中的addObject()方法用于向其Model中添加数据。Model底层实现为Map。
package com.bjpowernode.handlers;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;
public class MyController implements Controller {
@Override
public ModelAndView handleRequest(HttpServletRequest request,
HttpServletResponse response) throws Exception {
ModelAndView mv = new ModelAndView();
//向mv中添加数据
mv.addObject("message", "Hello SpringMVC World!");
//指定视图页面
mv.setViewName("/WEB-INF/jsp/welcome.jsp");
//使用视图解析器 了解 不太好用
//mv.setViewName("welcome");
return mv;
}
}
创建SpringMVC配置文件 注册处理器
注册视图解析器不建议使用,可以忽略。
这里我们注册处理器对处理的请求做出限制,限制.do
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd">
<!-- 注册视图解析器 其实就是注册文件的前缀和后缀-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/"/>
<property name="suffix" value=".jsp"/>
</bean>
<!-- 注册处理器对处理的请求做出限制,限制.do -->
<bean id="/my.do" class="com.bjpowernode.handlers.MyController"/>
</beans>
定义目标页面
创建位置
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<!DOCTYPE html>
<html>
<head>
<title>welcome page</title>
</head>
<body>
${message }
</body>
</html>
在WebContent下写个index.jsp
这个是启动时的欢迎页面。
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<!DOCTYPE html>
<html>
<head>
<title>My JSP 'index.jsp' starting page</title>
</head>
<body>
This is my JSP page. <br>
</body>
</html>
结果
启动访问:http://localhost:8080/02-primary-SpringMVC2/
显示This is my JSP page.
输入http://localhost:8080/02-primary-SpringMVC2/my.do(这个是在SpringMVC配置文件中注册处理器时实现的)
显示Hello SpringMVC World!
1.3
1.4 配置详解
(1)建议写为*.do
在没有特殊要求的情况下,SpringMVC的中央调度器Dispatcherservlet的<url-pattern/>
常使用后辍匹配方式,如写为*.do。
(2)不能写为/*
/*
是拦截动态资源交给Dispatcherservlet
这里的url-pattern不能写为/*,因为DispatcherServlet会将向动态页面的跳转请求,即向JsP页面的跳转请求也当作是一个普通的Controller 请求。中央调度器会调用处理器映射器为其查找相应的处理器。当然是找不到的,所以在这种情况下,所有的JSP页面跳转均会报404错误。
(3)最后也不要写为/
,/是拦截静态资源(比如图片)
在/03-urlpattern项目中,放入不同图片,如果写为/,不会显示图片。
解决静态资源访问斜杠有三种方法,这里省略。
1.5 绝对路径与相对路径
1.5.1 问题演示
问题演示
在index.jsp中添加一个超链接
<body>
<a href="hello.do">跳转到welcome页面</a>
</body>
为什么这里不加斜杠,如果加上了斜杠就会报错呢?
1.5.2 访问路径与资源名称
通常的URL资源访问路径由两部分构成:访问路径与资源名称。资源名称指的是要访问资源的直接名称,如show.jsp,或与要访问资源存在映射关系的间接名称,如show.do。而访问路径,则是通过该路径则可以定位到指定的资源,即在URL资源访问路径中除了资源名称以外的其它部分。
一般情况下,在URL访问路径中,最后一部分为资源名称,而其它部分则为访问路径。
1.5.3 绝对路径
绝对路径,是指根据给出的访问路径可以准确定位到资源的路径。例如,你要告诉对方你现在的位置,你说:我现在在北京故宫游客A入口处。这就是个绝对地址,听者根据你所述地址,可以准确的找到你。
而对于计算机中Web应用的绝对路径,则是指带访问协议的路径。例如下面的路径就是一个带有http访问协议的绝对路径。
http:/127.0.0.1:8080/primary/index.jsp
1.5.4 相对路径
相对路径,是指仅根据访问路径无法准确定位资源的路径。相对路径必须要结合其参照路径才可组成可以准确定位资源的绝对路径。参照路径的不同,所形成的可以准确定位资源的绝对路径也是不同的。在进行资源访问时,必须要将相对路径转换为绝对路径才可完成资源的准确定位。
在Web应用中,相对路径的写法有两种:一种是以斜杠开头的相对路径,一种是不以斜杠开头的相对路径。根据相对路径是否以斜杠开头,且出现的文件所处位置的不同,其默认的参照路径是不同的。这也是相对路径容易出错的地方:确定参照路径。
(1)以斜杠开头的相对路径
分为两种
A、前台路径
所谓前台路径是指,由浏览器解析执行的代码中所包含的路径。例如,html、css、js中的路径,及jsp中静态部分的路径。像html及jsp中的静态部分中的<img src=""/>、<a href=""></a>、<form action=""></form>
等;像css中的background:img(")等;像js中的window.location.href="”等,都属于前台路径。
前台路径的参照路径是Web服务器的根路径,即http://127.0.0.1:8080
B、后台路径
所谓后台路径是指,由服务器解析执行的代码及文伴中所包含的路径。例如,java代码中的路径、jsp文件动态部分(java代码块)中的路径、xml文件中的路径(xml文件是要被java代码加载入内存,并由java代码解析的)等。
后台路径的参照路径是Web应用的根路径。如http://127.0.0.1:8080/primary
C、后台路径特列
对于后台路径的参照路径有一个特例:当代码中使用response的sendRedirect()方法进行重定向时,其参照路径不是web应用的根路径,而是web服务器的根路径。
例如,执行response,sendRedirect("/show.jsp”);将会报404错误。因为其参照路径是Tomcat的根,而非当前项目的根。
/10-requestPath-5 这里虽然是后台路径,但是不能加斜杠
//重定向
response.sendRedirect("welcome.jsp");
(2)不以斜杠开头的相对路径
不以斜杠开头的相对路径,无论是前台路径,还是后台路径,其参照路径都是当前资源的访问路径,而不是当前资源的保存路径。
示例解析
/06-requestPath
index.jsp 初始页面这里
这个路径出现在jsp页面,所以是前台路径,而后台陆军的参照路径是:当前Web服务器的根路径。
当前为:http://localhost:8080
绝对路径=参照路径+相对路径,所以加斜杠访问不到
这个路径没有以/开头,所以其参照路径是当前的访问路径:http://localhost:8080/06-requestPath/
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<!DOCTYPE html>
<html>
<head>
<title>My JSP 'index.jsp' starting page</title>
</head>
<!-- 这个路径出现在jsp页面,所以是前台路径,而后台陆军的参照路径是:当前Web服务器的根路径。
当前为:http://localhost:8080
绝对路径=参照路径+相对路径,所以加/访问不到
-->
<!-- 这个路径没有以/开头,所以其参照路径是当前的访问路径:http://localhost:8080/06-requestPath/
-->
<body>
<a href="hello.do">跳转到welcome页面</a>
</body>
</html>
在springmvc配置文件里
注册处理器对处理的请求做出限制,限制.do
这里要求浏览器必须提交如下绝对路径才能访问到MyController这个资源:
这个路径出现在xml文件中,所以是后台路径,而后台陆军的参照路径是:Web应用的根路径。
当前为:http://localhost:8080/06-requestPath
绝对路径=参照路径+相对路径,所以加/可以访问到
<bean id="/hello.do" class="com.bjpowernode.handlers.MyController"/>
为什么跳转回index页面后地址栏会多出一个test
解决办法,/08-requestPath-3和/09-requestPath-4,放在文档里,这里不赘述了。