实例详解Spring MVC入门使用

栏目: Java · 发布时间: 5年前

内容简介:MVC模式(Model-View-Controller)是软件工程中的一种软件架构模式,把软件系统分为三个基本部分:模型(Model),视图(View)和控制器(Controller).通过分层使开发的软件结构更清晰,从而达到开发效率的提高,可维护性和扩展性得到提高.Spring提供的MVC框架是在J2EE Web开发中对MVC模式的一个实现,本文通过实例讲解一下Spring MVC 的使用.先来看一个HTTP request在Spring的MVC框架是怎么被处理的:(图片来源于Spring in Acti

MVC模式(Model-View-Controller)是软件工程中的一种软件架构模式,把软件系统分为三个基本部分:模型(Model),视图(View)和控制器(Controller).通过分层使开发的软件结构更清晰,从而达到开发效率的提高,可维护性和扩展性得到提高.Spring提供的MVC框架是在J2EE Web开发中对MVC模式的一个实现,本文通过实例讲解一下Spring MVC 的使用.

先来看一个HTTP request在Spring的MVC框架是怎么被处理的:(图片来源于Spring in Action)

实例详解Spring MVC入门使用

1,DispatcherServlet是Spring MVC的核心,它的本质是一个实现了J2EE标准中定义的HttpServlet,通过在web.xml配置<servlet-mapping>,来实现对request的监听.

<servlet>         <servlet-name>springTestServlet</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <load-on-startup>2</load-on-startup>     </servlet>     <servlet-mapping>
    <servlet-name>springTestServlet</servlet-name>
    <url-pattern>*.do</url-pattern>     </servlet-mapping>

** 以.do结尾的request都会由springTestServlet来处理.

2,3,当接受到request的时候,DispatcherServlet根据HandlerMapping的配置(HandlerMapping的配置文件默认根据<servlet-name>的值来决定,这里会读取springTestServlet-servlet.xml来获得HandlerMapping的配置信息),调用相应的Controller来对request进行业务处理.

<bean id="simpleUrlMapping"

class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">

<property name="mappings">             <props>
            <prop key="/login.do">loginController</prop>             </props>         </property>     </bean>     <bean id="loginController"

class="com.test.spring.mvc.contoller.LoginController"> <property

name="sessionForm"> <value>true</value> </property> <property

name="commandName"> <value>loginCommand</value> </property>

<property name="commandClass">
        <value>com.test.spring.mvc.commands.LoginCommand</value>
    </property>         <property name="authenticationService">             <ref

bean="authenticationService"/> </property> <property

name="formView"> <value>login</value> </property> <property

name="successView"> <value>loginDetail</value> </property>

</bean>

** 以login.do结尾的request由loginController来处理.<property name="formView">配置的是Controller接收到HTTP GET请求的时候需要显示的逻辑视图名,本例是显示login.jsp,<property name="successView">配置的是在接收到HTTP POST请求的时候需要显示的逻辑视图名,在本例中即login.jsp提交的时候需要显示名为loginDetail的逻辑视图.

4,Controller进行业务处理之后,返回一个ModelAndView对象.

return new ModelAndView(getSuccessView(),"loginDetail",loginDetail);

5,6,DispatcherServlet根据ViewResolver的配置(本例是在springTestServlet-servlet.xml文件中配置)将逻辑view转换到真正要显示的View,如JSP等.

<bean id="viewResolver"

class="org.springframework.web.servlet.view.InternalResourceViewResolver">

<property name="viewClass">
        <value>org.springframework.web.servlet.view.JstlView</value>
    </property>         <property name="prefix">             <value>/jsp/</value>
    </property>         <property name="suffix">             <value>.jsp</value>
    </property>     </bean>

**其作用是将Controller中返回的ModleAndView解析到具体的资源(JSP文件),如上例中的return new ModelAndView(getSuccessView();按照上面ViewResolver配置,会解析成/jsp/loginDetail.jsp.规则为prefix+ModelAndView的第二个参数+suffix.

示例的完整代码如下:

1web.xml:

<?xml version="1.0" encoding="UTF-8"?> <web-app id="WebApp_ID"

version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee

http://java.sun.com/xml/ns/j2... d"> <display-name>

prjSpring3</display-name>     <servlet>
    <servlet-name>springTestServlet</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <load-on-startup>2</load-on-startup>     </servlet>     <servlet-mapping>
    <servlet-name>springTestServlet</servlet-name>
    <url-pattern>*.do</url-pattern>     </servlet-mapping>     <listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>     <listener>
    <listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>
</listener>     <context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>/WEB-INF/springTest-services.xml</param-value>
</context-param>     <jsp-config>         <taglib>
        <taglib-uri>/spring</taglib-uri>
        <taglib-location>/WEB-INF/spring.tld</taglib-location>         </taglib>
</jsp-config> </web-app>

2,springTestServlet-servlet.xml的内容如下:

<?xml version="1.0" encoding="UTF-8"?> <beans

xmlns="http://www.springframework.org/schema/beans"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://www.springframework.org/schema/beans

http://www.springframework.or... d">

<bean id="simpleUrlMapping"

class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">

<property name="mappings">             <props>
            <prop key="/login.do">loginController</prop>             </props>         </property>     </bean>     <bean id="loginController"

class="com.test.spring.mvc.contoller.LoginController"> <property

name="sessionForm"> <value>true</value> </property> <property

name="commandName"> <value>loginCommand</value> </property>

<property name="commandClass">
        <value>com.test.spring.mvc.commands.LoginCommand</value>
    </property>         <property name="authenticationService">             <ref

bean="authenticationService"/> </property> <property

name="formView"> <value>login</value> </property> <property

name="successView"> <value>loginDetail</value> </property>

</bean>     <bean id="viewResolver"

class="org.springframework.web.servlet.view.InternalResourceViewResolver">

<property name="viewClass">
        <value>org.springframework.web.servlet.view.JstlView</value>
    </property>         <property name="prefix">             <value>/jsp/</value>
    </property>         <property name="suffix">             <value>.jsp</value>
    </property>     </bean> </beans>

3,springTest-services.xml的内容:

<bean id="authenticationService" class="com.test.spring.mvc.services.AuthenticationService"/>

4,Java代码:

public class LoginController extends SimpleFormController {

org.springframework.web.servlet.DispatcherServlet t;     protected

ModelAndView onSubmit(Object command) throws Exception{

LoginCommand loginCommand = (LoginCommand) command;
    authenticationService.authenticate(loginCommand);         LoginDetail

loginDetail =

authenticationService.getLoginDetail(loginCommand.getUserId());

return new ModelAndView(getSuccessView(),"loginDetail",loginDetail);
}         private AuthenticationService authenticationService;     public

AuthenticationService getAuthenticationService() { return

authenticationService; } public void setAuthenticationService(

AuthenticationService authenticationService) {
    this.authenticationService = authenticationService;     }     .... public

class LoginCommand { private String userId; private String password;

.... public class LoginDetail {     private String userName; public

class AuthenticationService { public void authenticate(LoginCommand

command) throws Exception{ if(command.getUserId()!= null &&

command.getUserId().equalsIgnoreCase("test")

&& command.getPassword()!= null && command.getPassword().equalsIgnoreCase("test")){             }else{             throw

new Exception("User id is not authenticated"); } } public

LoginDetail getLoginDetail(String userId){ return new

LoginDetail(userId); } }

5,JSP文件:放在web-inf的jsp文件夹内

login.jsp: <html><head> <title>Login to Spring Test</title></head>

<body> <h1>Please enter your userid and password.</h1> <form

method="post" action="login.do"> <table width="95%" bgcolor="f8f8ff"

border="0" cellspacing="0" cellpadding="5"> <tr> <td alignment="right"

width="20%">User id:</td> <td width="20%"><input type="text"

name="userId" value="test"></td> <td width="60%"> </tr> <tr> <td

alignment="right" width="20%">Password:</td> <td width="20%"><input

type="password" name="password" value="test"></td> <td width="60%">

</tr> </table>

<input type="submit" alignment="center"

value="login"> </form> </body> </html> loginDetail.jsp: <%@ taglib

uri="http://java.sun.com/jstl/core_rt" prefix="c"%> <html><head>

<title>Login to Spring Test</title></head> <body> <h1>Login

Details:</h1> <br/> Login as: <c:out value

="${loginDetail.userName}"/> <br/>logout </body> </html>

在浏览器的地址栏输入 http://localhost :8080/XXX/login.do进入login.jsp页面.

对配置的一些扩充点:

1为HandlerMapping和Controller的配置指定文件名称.

<servlet>

<servlet-name>springTestServlet</servlet-name>  
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>

<init-param>  
    <param-name>contextConfigLocation</param-name>  
    <param-value>classpath*:/xxx.xml</param-value>  
</init-param>  
<load-on-startup>1</load-on-startup>   </servlet>

2,加入对MVC注解的支持:

<?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:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans

http://www.springframework.or...

http://www.springframework.org/schema/context

http://www.springframework.or...

http://www.springframework.org/schema/mvc

http://www.springframework.or... d">

<context:annotation-config />     <context:component-scan

base-package="com.test.spring.mvc.contoller" />

<mvc:annotation-driven />   @Controller public class

AnnotationController {

@RequestMapping("annotation.do")

protected void test(HttpServletRequest request,

HttpServletResponse response) throws Exception{        

response.getWriter().println("test Spring MVC annotation");

}

3,注解和SimpleFormController同时使用需要在DispatcherServlet对应的servlet配置文件(本例是springTestServlet-servlet.xml)里面配置:

<bean

class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>

否则会发生下面的异常: javax.servlet.ServletException: No adapter for handler

handler implement a supported interface like Controller?

org.springframework.web.servlet.DispatcherServlet.getHandlerAdapter(DispatcherServlet.java:982)
org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:770)
org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:716)
org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:647)
org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:552)
javax.servlet.http.HttpServlet.service(HttpServlet.java:621)
javax.servlet.http.HttpServlet.service(HttpServlet.java:722)

在WEB应用中的context配置文件通过下面的方式load,ContextLoaderListener是一个实现了ServletContextListener的listener,

它能够访问<context-param>而得到配置文件的路径,加载后初始化了一个WebApplicationContext,并且将其作为Attribute放在了servletContext中,

所有可以访问servletContext的地方则可以访问WebApplicationContext.

<listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>     <context-param>
    <param-name>contextConfigLocation</param-name>         <param-value>
        /WEB-INF/springTest-services.xml,
        classpath:conf/jndiDSAppcontext.xml         </param-value>
</context-param>

**写在最后

程序员小伙伴们可以关注我一波,以后带来更精彩的**


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Coming of Age in Second Life

Coming of Age in Second Life

Tom Boellstorff / Princeton University Press / 2008-04-21 / USD 29.95

The gap between the virtual and the physical, and its effect on the ideas of personhood and relationships, is the most interesting aspect of Boellstorff's analysis... Boellstorff's portrayal of a virt......一起来看看 《Coming of Age in Second Life》 这本书的介绍吧!

CSS 压缩/解压工具
CSS 压缩/解压工具

在线压缩/解压 CSS 代码

随机密码生成器
随机密码生成器

多种字符组合密码

URL 编码/解码
URL 编码/解码

URL 编码/解码