SpringMVC入门

 在Web MVC架构中,使用者并不是直接连接至所需要的资源,而是先连接至前端控制器(Front controller),由前段控制器判断使用者的请求要分派(Dispatch)给哪一个控制对象(Controller)来处理请求,藉此达到控制使用者请求资源的目的。

 

   在Spring的Web MVC中,担任前段控制器角色的是org.springframework.web.servlet.DispatcherServlet,DispatcherServlet负责将客户的请求分配给控制对象,所以使用Spring Web MVC的第一步就是在Web.xml中定义DispatcherServlet

 

  <servlet>
        <servlet-name>dispatcherServlet</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
 <init-param>
  <param-name>contextConfigLocation</param-name>
  <param-value>/WEB-INF/mvc-config.xml</param-value>
 </init-param>
 <load-on-startup>1</load-on-startup>
    </servlet>

    <servlet-mapping>
        <servlet-name>dispatcherServlet</servlet-name>
        <url-pattern>*.do</url-pattern>
    </servlet-mapping>

 

在web.xml中定义了一个DispatcherServlet的实例dispatcherServlet,从设定中可以看到,所有连接至*.do结尾的请求都会由它来处理,“contextConfigLocation”初始参数用来设定Bean定义文件的位置与名称,如果不设置“contextConfigLocation”初始参数,则DispatcherServlet默认会使用Servlet的名称为前置,读取“Servlet名称-servlet.xml”作为其Bean定义文件,在上面的设定中则会读取mvc-config.xml

 

当然你也可以定义多个Bean定义文件的来源

    <servlet>
        <servlet-name>dispatcherServlet</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
 <init-param>
  <param-name>contextConfigLocation</param-name>
  <param-value>/WEB-INF/mvc-config.xml,/WEB-INF/other-servlet.xml</param-value>
 </init-param>
 <load-on-startup>1</load-on-startup>
    </servlet>

    <servlet-mapping>
        <servlet-name>dispatcherServlet</servlet-name>
        <url-pattern>*.do</url-pattern>
    </servlet-mapping>

 

DispatcherServlet负责分配请求至控制对象(Controller),在Spring Web MVC中,控制对象要实现org.springframework.web.servlet.mvc.Controller接口,Controller接口有一个不许实现的handleRequest()方法

 

public interface Controller {
 ModelAndView handleRequest(HttpServletRequest request,
   HttpServletResponse response) throws Exception; 
}

 

当Controller接收到DispatcherServlet分配的请求时,会执行handleRequest()方法来处理请求,处理完成后回传一个org.springframework.web.servlet.ModelAndView的实例,ModelAndView包括了要呈现在View层的Model数据,以及其他View层的相关信息

 

public class HellowController implements Controller {
 private String viewPage;
 public void setViewPage(String viewPage) {
  this.viewPage = viewPage;
 }
 
 public ModelAndView handleRequest(HttpServletRequest request,
   HttpServletResponse response) throws Exception {
  
 String user = request.getparameter("user");
 retrun new ModelAndView(viewPage, "user", user);
 }
}

 

在这个Controller中,取得来自使用者的user请求参数,并设定在ModelAndView的实例中,在这个例子中,高见ModelAndView的第一个自变量为要呈现的目标网页(或资源)路径,第二个自变量是设定用来取得Model对象的键(key),而第三个自变量是个View层呈现数据的Model对象,我们可以在xml文件设定Controller请求处理完毕之后,所要呈现数据的网页路径,来看一下Bean定义文件的内容,依据web.xml中对dispatcherServlet的初始参数设定为mvc-config.xml,如果没有初始参数的话,默认会调用dispatcherServlet-servlet.xml文件

 

   <bean id="viewResolver"  

class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/jsp/"/>
        <property name="suffix" value=".jsp"/>
   </bean>
  
   <bean name="/hello.do"
  class="包路径.HellowController">
 <property name="viewPage">
  <value>hello</vlaue>
 </property>
   </bean>

 

实际上DispatcherServlet必须根据一个HandlerMapping对象,决定请求由哪一个Controller来处理,DispatcherServlet默认使用org.springframework.web.servlet.handler.BeanNameUrlHandlerMappin,也就是根据Bean在定义时的"name"属性及使用者请求的URL,决定使用哪一个Controller实例,例如上面的例子,请求/.../hello.do时,DispatcherServlet根据"hello.do",决定要使用"name"为"hello.do"的Bean实例,所以根据上面的设定,就会将请求交给HelloController的实例来处理。

在Controller返回ModelAndView后,DispatcherServlet会交由ViewResolver对象来作View层的相关解析,因而你需要设置一个ViewResolver实例,在这个例子中将一jsp作为View层技术,所以使用org.springframework.web.servlet.view.InternalResourceViewResolve,InternalResourceViewResolver需要设置"viewClass",默认是org.springframework.web.servlet.InternalResourceView,这个类支持Servlet技术的相关资源。

InternalResourceViewResolver的"prefix"和"suffix"属性会与ModelAndView返回的路径信息借个,例如路径信息返回为"hello"字符串,则与以上的例子设定结合,实际路径就是/WEB-INF/jsp/hello.jsp。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值