目录(?)[+]

  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. POJ1042 Gone Fishing

    采用贪心策略. 假设他从1湖泊走到x 湖泊,这还剩下 h*12 - sigma(T1--Tx-1).(单位时间为5分钟).然后再用剩下的时间去钓1-x的湖泊的鱼. 每次都选择最多鱼的湖泊钓. code ...

  2. OAuthBase.cs

    using System; using System.Security.Cryptography; using System.Collections.Generic; using System.Tex ...

  3. Codeforces 191C Fools and Roads(树链拆分)

    题目链接:Codeforces 191C Fools and Roads 题目大意:给定一个N节点的数.然后有M次操作,每次从u移动到v.问说每条边被移动过的次数. 解题思路:树链剖分维护边,用一个数 ...

  4. AngularJS学习资源

    图灵社区 : 图书 : AngularJS入门教程 http://www.ituring.com.cn/book/1206 AngularJS 教程 | 菜鸟教程 http://www.runoob. ...

  5. 经典:十步完全理解 SQL

    经典:十步完全理解 SQL   来源:伯乐在线 链接:http://blog.jobbole.com/55086/ 很多程序员视 SQL 为洪水猛兽.SQL 是一种为数不多的声明性语言,它的运行方式完 ...

  6. statistics specify some columns count

    # -k1 follow the first column nr

  7. attempting to bokeyaunrun eclipse useing the jre instead of jdk,to run eclipse using

    关于eclipse运行出现,attempting to bokeyaunrun eclipse useing the jre instead of jdk,to run eclipse using错误 ...

  8. phpStrom添加插件:php文档生成(phpDocumentor)

    1. 依次打开:Files => Settings => External Tools => +(add) 2. 填写信息:name:phpDoc; group:PHP插件; des ...

  9. ArrayList与LinkedList时间复杂度之对比

    package ArrayList; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections ...

  10. JS一些小算术、1加到50、乘法口诀表、买鸡等

    //从1加到50 for (var a=1,i=0;a<51; a++) {i=a+i} document.write(i);//1加到50 var num=0; for(var i=1;i&l ...