建立Spring MVC
一个web请求的流程
DIspatcher Servlet的功能是识别和分配request给controller,同时也会识别Response来调用web。
Controller会识别用哪种方法(service)处理请求,也会返回处理结果。
首先需要创建和配置dispatcher servlet
(有些IDE会自动建立和配置)
Dispatcher 在用户请求传递给控制器之前拦截它们。要使dispatcher servlet拦截所有用户请求,就需要在web.xml 中配置它。
在xml中与其他servlet一样,在和中声明和配置。
在web.xml中
<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!--dispatcher servlet 在这个包中-->
<load-on-startup>1</load-on-startup>
<!--这里设置加载的优先级,数越小,加载越优先-->
</servlet>
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>*.htm</url-pattern>
<!--这里指明要处理的是哪个url,这句中指明所有的扩展名为.htm的请求都由dispatcher处理-->
</servlet-mapping>
在web.xml建立好dispatcher后,其他的匹配只需要让spring 自动设置即可。
创建和配置controller
controllers是一个Java文件。
写一个controller,用@Controller 注释标注它,来声明它。
设置控制器的属性:
@RequestMapping:用于指定控制器处理的url 映射。
这些映射既可以在类级完成,也可以在方法级完成。
通过这层映射注释,dispatcher 就可以分辨哪一个controller控制哪些request。
该注释有以下参数:
value:此属性指定控制器所处理的URL。通常在类级指明。
method:指定控制器处理哪种方法的请求。通常在方法级指明。
method有以下属性:
RequestMethod.GET 指明要处理GET方法的请求用这个注释下的方法。 RequestMethod.POST 指明要处理POST方法的请求用这个注释下的方法。
例子一:不跳转到新页面的controller
建立了一个controller,由@RequestMapping可知,这是处理/hello.htm的请求,并且请求方法是get
方法级的@RequestMapping注释下的方法,就是对这个请求的处理(service)
@Controller
@RequestMapping(value="/hello.htm")
public class HelloMessageController {
@RequestMapping(method = RequestMethod.GET)
public String helloWorld(ModelMap modelMap) {
System.out.println("on method");
modelMap.put("mssg", "Hello Spring !!");
return "index";
}}
jsp中请求:
<% response.sendRedirect("hello.htm"); %>
jSP直接发送对hello.htm的请求。然后controller根据请求处理。
例子二:跳转到新页面的controller
首先在一个jsp页面中,建立请求
<a href="index.htm">Index</a>
<a href="contact.htm">Contact</a>
在controller页面,处理请求
@Controllerpublic class WebController {
@RequestMapping(value="/index.htm")
public String getIndex(){
return "index";
}
@RequestMapping(value="/contact.htm")
public String getContact(){
return"contact";
}
}
第一个处理方法,在controller中返回的是“index”没有前后缀。
是因为controller的返回会被 dispatcher 自动识别匹配
在spring MVC 自动创建的文件 dispatcher-servlet.xml 中 已经自动声明了对response的识别
在dispatcher-servlet.xml中
<bean id="viewResolver"
class="org.springframework.web.servlet.view.InternalResourceViewResolver"
p:prefix="/WEB-INF/jsp/" <!--prefix表示jsp文件的前缀-->
p:suffix=".jsp" <!--suffix表示jsp文件的后缀-->
/>
前缀和后缀中间的部分就是控制器方法return的值。