目录(?)[+]

  1. webxml配置文件
  2. 注如果使用注解可以加上--
  3. servlet上下文配置文件 test-servletxml
  4. 实体类Empjava
  5. StartController控制器
  6. 控制器EmpController--以单个参数形式传递参数
  7. 控制器EmpController2--以对象形式封装表单参数package test
  8. 控制器EmpFormController与继承AbstractCommandController类型控制器的区别
  9. MyDatePropertyjava属性编辑器
  10. add_empjap页面其他页面没有实质内容就不贴了
 

练习项目:test

SpringMVC 实例 --非注解,只用于学习理解。到了spring 3.0以后或许部分东西已经过时了,在实际工作中并不一定好用。

但对于理解SpringMVC的实现方式很有帮助,在以后使用注解时,会明白是怎么个来龙去脉!

web.xml配置文件:

<?xml version="1.0" encoding="UTF-8"?> < 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">   <welcome-file-list>     <welcome-file>index.jsp</welcome-file>   </welcome-file-list>   <servlet>    <!-- 框架总的控制中心, -->    <!-- 当浏览器发送一个请求时,DispatcherServlet会对以下配置     <servlet-mapping>      <servlet-name>test</servlet-name>      <url-pattern>/*.do</url-pattern>     </servlet-mapping>        的url /*.do类型的请求拦截。然后初始化DispatcherServlet的一个实例(servlet的上下文,单利模式),同时读取配置文件(xml类型)初始化里面的bean。    【如何没有指定文件的目录和名称时,默认会到/WEB-INF目录下寻找以servletName加上-servlet为名的xml文件,    即:约定俗成的文件路径/WEB-INF/servletName-servlet.xml。如:/WEB-INF/test-servlet.xml】        -->    <servlet-name>test</servlet-name>    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>    <!-- 以初始化参数的方式    <init-param>     <param-name>contextConfigLocation</param-name> 名字不能变,必须是这个(contextConfigLocation意思是上下文配置文件位置)。         【1.值是我们的配置文件路径,包括文件名。(src包下的东西在编译过都会跑到/WEB-INF/classes下,      所以我们这里指定的路径问/WEB-INF/classes/xxx-servlet.xml).      2.当有多个配置servlet上下文配置文件时,只要我们使用“,”、“空格”等加以分割。      3.也支持通配符*,如xxx-servlet1.xml,xxx-servlet2.xml,xxx-servlet3.xml等任意多个配置文件        参数值(param-value)就可以写成 /WEB-INF/classes/xxx-servlet*.xml了。        或/WEB-INF/classes/spring/*.xml了。     】     <param-value>/WEB-INF/classes/xxx-servlet.xml,/WEB-INF/classes/xxx2.xml</param-value>    </init-param> -->

<!-- 系统启动时自动加载 初始化,否则在初次使用时加载 初始化   //设置这一项是当系统启动时自动加载并初始化DispatcherServlet(分发servlet,总的控制中心),以及映射bean(为DispatcherServlet具体分送到哪一个action或者controller所配置的映射bean)。如果不设置则在第一次请求 是初始化,这样第一次请求比较慢,所以推崇第一种方式。   -->   <load-on-startup>1</load-on-startup>   </servlet>     <servlet-mapping>    <servlet-name>test</servlet-name>    <url-pattern>*.do</url-pattern>   </servlet-mapping> < /web-app>

注:如果使用注解可以加上-->

<beans>

<!-- 组件扫描:                  当我加载配置文件时,到我们指定的包下扫描(读取)java文件,寻找标注注解的地方(接口,类,方法或者其他),进行完成初始化。               -->              <context:component-scan base-package="test.controller"></context:component-scan>                   </beans>

servlet上下文配置文件 test-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" xmlns:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:util="http://www.springframework.org/schema/util" xmlns:mvc="http://www.springframework.org/schema/mvc" xsi:schemaLocation="    http://www.springframework.org/schema/beans    http://www.springframework.org/schema/beans/spring-beans-3.0.xsd    http://www.springframework.org/schema/context    http://www.springframework.org/schema/context/spring-context-3.0.xsd    http://www.springframework.org/schema/util    http://www.springframework.org/schema/util/spring-util-3.0.xsd    http://www.springframework.org/schema/mvc    http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd            ">            <!-- 当我每添加一个控制器,就会在test-servlet.xml配置一个bean和添加一个路径的映射。              这样会很麻烦。             -->                       <!-- 请求映射 -->            <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping" ><!--定义映射处理器: 按类别(如:HandlerMapping)寻找所有不需要id -->              <property name="mappings"><!-- 属性mappings是一个映射列表 键值对 key=访问路径 value(控制器id)= id为StartController的bean -->               <props>                <prop key="start.do">startController</prop>                <prop key="login.do">loginController</prop>                <prop key="add_emp.do">addEmpController</prop>                <prop key="addEmp.do">addEmpSuccessController</prop>               </props>              </property>            </bean>                     <bean id="startController" class="test.StartController" /> <!-- 配置控制器 -->            <!-- 对于不需要处理只做一个转发的可以用下面的方式 -->            <bean id="loginController" class="org.springframework.web.servlet.mvc.ParameterizableViewController" >              <!-- 简单的返回视图名 通过viewName的value值login直接调用视图解析器,转发到login.jsp -->              <property name="viewName" value="login"></property>            </bean>            <!-- 使用UrlFilenameViewController进行直接跳转,必须保证url和最终返回的视图名(返回的视图名 也必须有对应视图add_emp.jsp存在)保持一致。所以prop的key为"add_emp.do" -->            <bean id="addEmpController" class="org.springframework.web.servlet.mvc.UrlFilenameViewController" />            <bean id="addEmpSuccessController" class="test.EmpController2">              <property name="commandClass" value="test.Emp"></property><!-- 如何知道command是封装Emp对象的,是这里设置的,这里会采用反射机制实例化一个指定类别的对象(也就是Emp),并且将表单参数自动注入。 -->            </bean>                      <!-- 视图解析器(只需要配置一个就可以了): 从逻辑视图到真正视图的映射 -->            <bean class="org.springframework.web.servlet.view.UrlBasedViewResolver"><!-- url视图解析器 -->              <!-- 一般基于jsp技术实现的时候,都会帮jsp隐藏起来。什么叫隐藏呢?               将jsp放在WEB-INF下面,直接访问jsp发现找不到, 避免直接访问jsp页面,这就叫隐藏。 -->              <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"></property>              <property name="prefix" value="/WEB-INF/jsp/" />              <property name="suffix" value=".jsp" />            </bean>                       </beans>

实体类Emp.java:

package test;

import java.text.SimpleDateFormat; import java.util.Date;

public class Emp { private int id; private String name; private String phone; private Date hireDate; public String getName() {           return name; } public void setName(String name) {              this.name = name; } public String getPhone() {             return phone; } public void setPhone(String phone) {              this.phone = phone; } public int getId() {             return id; } public void setId(int id) {          this.id = id; } public Date getHireDate() {            return hireDate; } public void setHireDate(Date hireDate) {         this.hireDate = hireDate; }

@Override public String toString() {            return id+","+name+","+phone+","+new SimpleDateFormat("yyyy-MM-dd").format(hireDate); }
}

StartController控制器:

package test;

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 StartController implements Controller {

@Override public ModelAndView handleRequest(HttpServletRequest request,    HttpServletResponse response) throws Exception {    System.out.println("成功了!");   return new ModelAndView("start"); //视图的逻辑名称,具体用jsp、framemark还是其他比不知道,也不需要知道。 模块解耦分离。 }

}

控制器EmpController--以单个参数形式传递参数:

package test;

import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse;

import org.springframework.web.servlet.ModelAndView; import org.springframework.web.servlet.mvc.AbstractController;

public class EmpController extends AbstractController {

@Override protected ModelAndView handleRequestInternal(HttpServletRequest request,    HttpServletResponse response) throws Exception {   //逐个获取表单参数,当参数很多时就会变的麻烦。如果我们可以 直接以一个对象的形式获取就方便的多了。   //不用担心EmpController2控制器实现了这个功能。   String name = request.getParameter("name");   String phone = request.getParameter("phone");   Emp emp = new Emp();   emp.setName(name);   emp.setPhone(phone);   //service.addEmp(emp); //一般是这样用的   System.out.println(emp);   return null; } }

控制器EmpController2--以对象形式封装表单参数:

package test;

import java.text.SimpleDateFormat; import java.util.Date; import java.util.Map;

import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse;

import org.springframework.beans.propertyeditors.CustomDateEditor; import org.springframework.validation.BindException; import org.springframework.web.bind.ServletRequestDataBinder; import org.springframework.web.servlet.ModelAndView; import org.springframework.web.servlet.mvc.AbstractCommandController; /** * 当我每添加一个控制器,就会在test-servlet.xml配置一个bean和添加一个路径的映射。 * 这样会很麻烦。 * * 视图解析器只需要配置一个就可以了。 * @author Administrator * */ public class EmpController2 extends AbstractCommandController { /**   * Spring 3.0 已经将AbstractCommandController类标注为过期了,她提倡我们使用注解。   * 我们这里只是帮助大家理解如何将表单参数自动封装为command(是一个Object类型的对象)对象的。   *   * 将表单参数自动封装到command对象中。但是需要在test-servlet.xml里配置command的类型。   * BindException绑定异常,表单中的参数,在赋给对象Emp是需要类型转换。当转换出错是异常信息就会在这里。   *   * 与SimpleFormController的区别在于,method为post时onSubmit才会提交。   */ @Override protected ModelAndView handle(HttpServletRequest request,    HttpServletResponse response, Object command, BindException bindException)    throws Exception {   Emp emp = (Emp)command;   System.out.println(emp.getHireDate());   System.out.println(emp);   //return "success"; //当我们不返回模型视图是我们也可以直接返回一个String字符串,这个字符串表示视图名。   return new ModelAndView("success");//返回逻辑视图名,在test-servlet.xml里会得到 从逻辑视图到真正视图的映射。 } public Map xxx(HttpServletRequest request, HttpServletResponse response){ //基于惯例的处理模式,当没有指定视图名称 默认根据请求路径来返回响应的视图名有些类似于UrlFilenameViewController。   return null; } //注册时间编辑器 @Override protected void initBinder(HttpServletRequest request,    ServletRequestDataBinder binder) throws Exception {   //binder.registerCustomEditor(Date.class, new MyDateProperty()); //完全自己定义编辑器。 MyDateProperty为我们自己实现的时间编辑器。   binder.registerCustomEditor(Date.class, new CustomDateEditor(new SimpleDateFormat("yyyy-MM-dd"),true));//自定义编辑器(spring提供的一个半成品编辑器)。   //super.initBinder(request, binder); }

}

控制器EmpFormController:与继承AbstractCommandController类型控制器的区别。

package test;

import org.springframework.web.servlet.ModelAndView; import org.springframework.web.servlet.mvc.SimpleFormController;

public class EmpFormController extends SimpleFormController {

/**   * 与AbstractCommandController的区别在于FormController 当 method为post时onSubmit才会提交。   */ @Override protected ModelAndView onSubmit(Object command) throws Exception {   // TODO Auto-generated method stub   Emp emp = (Emp)command;   System.out.println(emp);     //return super.onSubmit(command);   return new ModelAndView("success"); } }

MyDateProperty.java属性编辑器:

package test;

import java.beans.PropertyEditorSupport; import java.text.ParseException; import java.text.SimpleDateFormat; /** * 属性编辑器 - 将文本转换为xxx对象或将对象转换成文本。 * @author Administrator */ public class MyDateProperty extends PropertyEditorSupport {

@Override public String getAsText() {   return super.getAsText(); }

@Override public void setAsText(String arg0) throws IllegalArgumentException {   SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");   try {    format.parse(arg0);   } catch (ParseException e) {    e.printStackTrace();   }   //super.setAsText(arg0); }

@Override public void setValue(Object arg0) {   super.setValue(arg0); } }

add_emp.jap页面:(其他页面没有实质内容就不贴了)

<%@ page language="java" import="java.util.*" pageEncoding="ISO-8859-1"%> < !DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> < html>   <head>     <title>My JSP add_emp.jsp starting page</title>   </head>     <body>     This is add emp JSP page. <br>     <form action="addEmp.do" method="post">     id:<input name="id" /><br />     name:<input name="name" /><br />     phone:<input name="phone" /><br />     hireDate:<input name="hireDate" /><br />     <input type="submit" value="add" />     </form>   </body> < /html>

spring mvc 非注解形式的更多相关文章

  1. spring mvc 基于注解的使用总结

    本文转自http://blog.csdn.net/lufeng20/article/details/7598801 概述 继 Spring 2.0 对 Spring MVC 进行重大升级后,Sprin ...

  2. spring mvc 基于注解 配置默认 handlermapping

    spring mvc 是类似于 Struts 的框架.他们都有一个最主要的功能就是URL路由.URL路由能将请求与响应请求处理逻辑的类(在Struts中即是action,在spring mvc 中即是 ...

  3. Spring MVC学习总结(2)——Spring MVC常用注解说明

        使用Spring MVC的注解及其用法和其它相关知识来实现控制器功能. 02     之前在使用Struts2实现MVC的注解时,是借助struts2-convention这个插件,如今我们使 ...

  4. 基于spring mvc的注解DEMO完整例子

    弃用了struts,用spring mvc框架做了几个项目,感觉都不错,而且使用了注解方式,可以省掉一大堆配置文件.本文主要介绍使用注解方式配置的spring mvc,之前写的spring3.0 mv ...

  5. java spring mvc 全注解

    本人苦逼学生一枚,马上就要毕业,面临找工作,实在是不想离开学校.在老师的教导下学习了spring mvc ,配置文件实在繁琐,因此网上百度学习了spring mvc 全注解方式完成spring的装配工 ...

  6. Spring MVC Framework 注解

    ControllerAdvice Spring MVC Framework会把 @ControllerAdvice注解内部使用 @ExceptionHandler.@InitBinder.@Model ...

  7. spring mvc常用注解的说明

    最近一段时间学习了springboot,所以熟悉一下mvc中常用的注解,这样可以方便开发 简介: @RequestMapping RequestMapping是一个用来处理请求地址映射的注解,可用于类 ...

  8. spring mvc常用注解总结

    1.@RequestMapping@RequestMappingRequestMapping是一个用来处理请求地址映射的注解(将请求映射到对应的控制器方法中),可用于类或方法上.用于类上,表示类中的所 ...

  9. Spring入门(十三):Spring MVC常用注解讲解

    在使用Spring MVC开发Web应用程序时,控制器Controller的开发非常重要,虽然说视图(JSP或者是Thymeleaf)也很重要,因为它才是直接呈现给用户的,不过由于现在前端越来越重要, ...

随机推荐

  1. Chocolate&&木块拼接&&Cards&& Wet Shark and Bishops

    B. Chocolate time limit per test 1 second memory limit per test 256 megabytes input standard input o ...

  2. 赵雅智_BroadcastReceiver电话监听

    AndroidManifest.xml 注冊广播接收者 加入权限 <?xml version="1.0" encoding="utf-8"?> &l ...

  3. Eclipse和PyDev搭建python开发环境

                   Eclipse和PyDev搭建python开发环境 1.1整体目标 本文档作为python学习者的新手教程,通过本教程能够了解python用途.语法.在实际工作中的应 ...

  4. 将类数组对象(array-like object)转化为数组对象(Array object)

    用法:Array.prototype.slice.call(array-like object) // 创建一个类数组对象 var alo = {0:"a", 1:"b& ...

  5. html系列教程--p param progress rp rt ruby script select small source

    <p> 标签:用户段落划分或折行的标签 <param> 标签:param 元素允许您为插入 XHTML 文档的对象规定 run-time 设置,也就是说,此标签可为包含它的 & ...

  6. L6 Shell

    写出以下shell脚本1 判定一个用参数指定的文件是否为可执行,如果不是,则改为可执行#!/bin/bash if [ -x $1 ]then echo "OK"else echo ...

  7. iOS7、iOS8推送通知的区别

    iOS8版本以后的推送通知代码[[UIApplication sharedApplication] registerUserNotificationSettings:[UIUserNotificati ...

  8. 关于函数strtok和strtok_r的使用要点和实现原理(二)

    http://www.cnblogs.com/stemon/p/4013264.html已经介绍了使用strtok函数的一些注意事项,本篇将介绍strtok的一个应用并引出strtok_r函数. 1. ...

  9. 再谈PHP、Python与Ruby

    一句话总结 简单地总结: 假如你想帮他尽快找个活儿,赚到钱,推荐PHP. 假如你想让他成为一个高效工程师,推荐 Python. 假如你想让他爱上他的工作,推荐 Ruby. 语言的选择 编程语言非常重要 ...

  10. FAQ:Python环境变量配置

    Python安装安装成,需要配置环境变量: 默认情况下,在windows下安装python之后,系统并不会自动添加相应的环境变量.此时不能在命令行直接使用python命令. 1. 首先需要在系统中注册 ...