Spring 框架提供了构建 Web 应用程序的全功能 MVC 模块。使用 Spring
可插入的 MVC 架构,可以选择是使用内置的 Spring Web 框架还是 Struts 这样的 Web 框架。通过策略接口,Spring
框架是高度可配置的,而且包含多种视图技术,例如 JavaServer Pages(JSP)技术、Velocity、Tiles、iText 和
POI。Spring MVC 框架并不知道使用的视图,所以不会强迫您只使用 JSP 技术。Spring MVC
分离了控制器、模型对象、分派器以及处理程序对象的角色,这种分离让它们更容易进行定制。
Spring 的 Web MVC 框架是围绕
DispatcherServlet
设计的,它把请求分派给处理程序,同时带有可配置的处理程序映射、视图解析、本地语言、主题解析以及上载文件支持。默认的处理程序是非常简单的 Controller
接口,只有一个方法 ModelAndView handleRequest(request, response)。Spring
提供了一个控制器层次结构,可以派生子类。如果应用程序需要处理用户输入表单,那么可以继承
AbstractFormController。如果需要把多页输入处理到一个表单,那么可以继承
AbstractWizardFormController。
Spring
MVC对于现在较成熟的Model-View-Control框架而言,其解决的主要问题无外乎下面几部分:
1》将web页面中的输入元素封装为一个(请求)数据对象。
2》根据请求的不同,调度相应的逻辑处理单元,并将(请求)数据对象作为参数传入。
3》逻辑处理单元完成运算后,返回一个结果数据对象。
4》将结果数据对象中的数据与预先设计的表现层相融合并展现给用户。
开发步骤:
首先新建web Project项目:MySpringMvc
1.加载项目所需要的jar包;
spring.jar -------------------------这个在spring2.5.6资源包的dist下面
spring-webmvc.jar---------------这个在spring2.5.6资源包的dist/module下面
2.配置web.xml文件
<?xml version="1.0" encoding="UTF-8"?>
- <span style="font-size: large;"><web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
- http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
- <servlet>
- <servlet-name>dd</servlet-name>
- <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
- <!-- <init-param>-->
- <!-- <param-name>contextConfigLocation</param-name>-->
- <!-- <param-value>/WEB-INF/applicationContext.xml</param-value>-->
- <!-- </init-param>-->
- </servlet>
- <!--
- applicationContext.xml文件代表示应用程序服务的配置和 bean 配置。如果想装入多个配置文件,可以在
- <param-value>标记中用逗号作分隔符。
- springmvc配置文件与spring配置的servlet名称有关[如本配置中是dd]
- 通常springmvc配置文件名称结构为:[servlet-name]-servlet.xml,
- 如果你没有指定init-param里面contextCofigLocation的值中对应的XML文件的话
- (也就是applicationContext全局配置文件没有配置在web.xml中的话),那么像本
- 段代码对应在springmvc中的配置文件就应该是/WEB-INF/dipatcher-servlet.xml这样的文件,
- 否则如果配置了applicaitonContext.xml这样的spring全局配置文件,如本配置那么就必须为/WEB-INF/dd-servlet.xml
- -->
- <servlet-mapping>
- <servlet-name>dd</servlet-name>
- <url-pattern>*.do</url-pattern>
- </servlet-mapping>
- </web-app></span>
2.由于上面的初始化参数中没有指定名字的XML文件,因此在WEB-INF下面建立
dispatcher-servlet.xml
- <span style="font-size: medium;"><span style="font-size: large;"><?xml version="1.0" encoding="UTF-8"?>
- <!--看到下面的beans这个元素标签没有,必须有标签的声明-->
- <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.org/schema/beans/spring-beans-2.0.xsd">
- <!-- URL Mapping -->
- <bean id="urlMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
- <property name="mappings">
- <props>
- <prop key="/regAction.do">regAction</prop>
- </props>
- </property>
- </bean>
- <!-- definition of View Resolver -->
- <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>/view/</value>
- </property>
- <property name="suffix">
- <value>.jsp</value>
- </property>
- </bean>
- <!-- formController ,这个formController可以配置也可以不配置-->
- <bean id="formController"
- class="org.springframework.web.servlet.mvc.ParameterizableViewController">
- <property name="viewName">
- <value>form</value>
- </property>
- </bean>
- <!-- Action Definition -->
- <bean id="regAction" class="org.lee.springmvc.demo.RegAction">
- <!--在MySpringMvc这个项目中就没有配置这个commandClass,
- 因为它提前调用了setCommandClass(LoginForm.class)这个方法;这样跟下面效果一样
- 不过还是建议配成下面这样的更好
- -->
- <property name="commandClass">
- <value>org.lee.springmvc.demo.RegInfo</value>
- </property>
- <property name="error_view">
- <value>error</value>
- </property>
- <property name="success_view">
- <value>success</value>
- </property>
- <property name="commandName">
- <value>myCommand</value>
- </property>
- </bean>
- </beans></span></span>
3.建立JSP文件
form.jsp
- <span style="font-size: medium;"><span style="font-size: large;"><%@page contentType="text/html"%>
- <%@page pageEncoding="UTF-8"%>
- <%@taglib prefix="spring"
- uri="http://www.springframework.org/tags"%>
- <%@taglib prefix="c"
- uri="http://java.sun.com/jsp/jstl/core"%>
- <html>
- <head>
- <meta http-equiv="Content-Type"
- content="text/html; charset=UTF-8">
- <title>Login Form</title>
- </head>
- <body>
- <h1>登入表单</h1>
- <spring:bind path="command.*">
- <font color="red">
- <b>${status.errorMessage}</b>
- </font><br>
- </spring:bind>
- 请输入使用者名称与密码:<p>
- <form name="loginform" action="login.do" method="post">
- <spring:bind path="command.userName">
- 名称 <input type="text" name="${status.expression}" value="${status.value}"/>
- <font color="red"><c:out value="${status.errorMessage}" /></font><br/>
- </spring:bind>
- <spring:bind path="command.password">
- 密码 <input type="password" name="${status.expression}" value="${status.value}"/>
- <font color="red"><c:out value="${status.errorMessage}" /></font><br/>
- </spring:bind>
- <input type="submit" value="确定"/>
- </form>
- 注意:输入错误会再回到这个页面中。
- </body>
- </html></span></span>
4.建立jsp文件
success.jsp
- <span style="font-size: medium;"><span style="font-size: large;"><%@page contentType="text/html"%>
- <%@page pageEncoding="GBK"%>
- <html>
- <head>
- <meta http-equiv="Content-Type" content="text/html; charset=GBK">
- <title>登入成功</title>
- </head>
- <body>
- <H1>哈啰! ${welcomeuser}!!</H1>
- 这是您的神秘礼物!^o^<a href="login.do">退出登录</a>
- </body>
- </html></span></span>
5.建立一个java bean LoginForm.java
- <span style="font-size: medium;"><span style="font-size: large;">package zz.it.beans;
- public class LoginForm {
- private String userName;
- private String password;
- public String getPassword() {
- return password;
- }
- public void setPassword(String password) {
- this.password = password;
- }
- public String getUserName() {
- return userName;
- }
- public void setUserName(String userName) {
- this.userName = userName;
- }
- }
- </span></span>
6.建立controller LoginController.java
- <span style="font-size: medium;"><span style="font-size: large;">package zz.it.controller;
- import org.springframework.validation.BindException;
- import org.springframework.web.servlet.ModelAndView;
- import org.springframework.web.servlet.mvc.SimpleFormController;
- import zz.it.beans.LoginForm;
- public class LoginController extends SimpleFormController {
- /**
- * 构造方法
- */
- public LoginController() {
- // TODO Auto-generated constructor stub
- //setCommandClass(LoginForm.class);
- //这句话要是不写的话,那么在dd-servlet.xml中的loginController里面配置上如下:
- // <property name="commandClass">
- //<value>zz.it.beans.LoginForm</value>
- //</property>
- //这样效果也是一样的
- }
- public ModelAndView onSubmit(Object cmd, BindException errors) {
- LoginForm loginForm = (LoginForm) cmd;
- if (loginForm.getUserName().equals("test")
- && loginForm.getPassword().equals("test")) {
- return new ModelAndView(getSuccessView(), "welcomeuser", loginForm
- .getUserName());
- } else {
- errors.reject("ccc", "用户名或密码有误!");
- errors.rejectValue("userName", "nameErr", null, "用户名错误");
- errors.rejectValue("password", "passErr", null, "密码错误");
- return new ModelAndView(getFormView(), errors.getModel());
- }
- }
- }
- </span></span>
7.最后,整合部署,访问http://localhost:1234/MySpringMvc/login.do
效果图
初始登录界面
登录成功页面
登录失败页面
我估计初学者,最关心的大都有这两个问题
1.这个controller是怎样像struts那样进行封装数据的
2.<spring:bind>为什么这么用,为什么取值只能是command.xxx