SpringMVC 实例 --非注解【过时的,留作回忆】

练习项目: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>



本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/539446.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

云场景实践研究第27期:袋鼠云

更多云场景实践研究案例&#xff0c;点击这里&#xff1a;【云场景实践研究合集】联合不是简单的加法&#xff0c;而是无限的生态&#xff0c;谁会是下一个独角兽 随着网站论坛粉丝数高涨&#xff0c;原有系统架构和服务器性能已无法满足热情高涨的粉丝需求。同时&#xff0c;网…

怎么在电脑上看磁盘分配单元的大小_电脑磁盘到底该不该分区?怎么分区?

“哥&#xff0c;在吗&#xff1f;在你家新买的adolbook14 2020怎么只有一个C盘啊?”“电脑磁盘怎么重新分区啊&#xff1f;在线等&#xff01;急&#xff01;”“本电脑小白可太骄傲了&#xff0c;我居然自己给电脑磁盘分区了&#xff0c;一通操作猛如虎&#xff01;”……那…

电脑如何进入bios模式_华硕笔记本电脑开机自动进入BIOS界面怎么办?

最近很多人的华硕牌子笔记本有问题&#xff0c;说自己开机就直接进入BIOS了。对于这些小白来说&#xff0c;一脸懵逼啊&#xff0c;不知道怎么解决&#xff0c;其实大家也不要着急&#xff0c;坚哥来简单帮大家分析一下。第一、可能系统的文件被更改&#xff0c;从而导致无法启…

springmvc在controller和视图之间传递参数

从视图向controller传递值&#xff0c; controller <--- 视图 1&#xff09;简单类型&#xff0c;如int, String, 应在变量名前加RequestParam注解&#xff0c;例如&#xff1a; RequestMapping("hello3")public String hello3( RequestParam("name" …

苹果手机怎么清理听筒灰尘_怎么清理手机听筒的灰尘?

作为一个专业的强迫症从业者&#xff0c;我已经看不惯手机听筒的灰尘很久了&#xff0c;在经历无数次失败之后&#xff08;针&#xff0c;牙刷&#xff0c;牙签&#xff0c;吸尘器等等&#xff09;。我必须要来分享一个超级实用的方法清理手机听筒的灰尘。那就是&#xff0c;起…

linux mrtg 命令,linux服务器之流量监控(MRTG)

本系列文章原则&#xff1a;灰常详细&#xff0c;灰常简单&#xff0c;新手包学包会&#xff01;因其简单&#xff0c;故未涉及安全性方面的考虑呵&#xff01;本实验服务器为rhel-5-server-i386&#xff0c;客户端为windows xp。本实验所用软件包均在rhel-5-server-i386-dvd.i…

搭建网站必不可少的知识14

安全组配置 “操作”-“安全组配置” 单击“内网入方向”&#xff0c;“添加安全组规则”默认配置即可“确定”。在公网入方向和公网出方向都这样添加上。&#xff08;如果存在就先删除后在添加&#xff09;。现在应该能登录了。 输入密码&#xff0c;点击“确定” 登录后只有一…

8代cpu能跑linux,Intel公布6/7/8代桌面CPU打漏洞补丁性能结果:影响很小

今天&#xff0c;Intel执行副总裁数据、数据中心事业部总经理Navin Shenoy(孙纳颐)发布了第二篇性能测试文章&#xff0c;针对客户端也就是桌面平台用户在打上修复“Spectre”和“Meltdown”漏洞补丁之后的实际情况。对于大部分普通电脑用户来说&#xff0c;性能的影响并不显著…

Spring mvc interceptor配置拦截器

原文&#xff1a;http://blog.csdn.net/liyisong2008/article/details/42915715 -------------------------------------------------------------------------- xml代码&#xff1a; [java] view plaincopy <?xml version"1.0" encoding"UTF-8"?>…

rm: 无法删除swap: 不允许的操作_safe-rm老板再也不用担心我删库跑路啦[视频]

saferm 老板再不怕我删库跑路https://www.zhihu.com/video/1177717527541731328在 linux 上&#xff0c;使用 rm 是一件非常危险的事情(最近又有朋友遇到了我才想起了写这篇文章)&#xff0c;如果不幸手残执行了 rm -rf 删除了重要文件&#xff0c;建议你准备收拾包袱跑路吧。既…

Spring MVC 流程图

Spring工作流程描述1. 用户向服务器发送请求&#xff0c;请求被Spring 前端控制Servelt DispatcherServlet捕获&#xff1b;2. DispatcherServlet对请求URL进行解析&#xff0c;得到请求资源标识符&#xff08;URI&#xff09;。然后根据该URI&#xff0c;调用HandlerMapping获…

kafka maven没有下载_Kafka 系列(三)——Kafka 生产者详解

首先介绍一下 Kafka 生产者发送消息的过程&#xff1a;Kafka 会将发送消息包装为 ProducerRecord 对象&#xff0c; ProducerRecord 对象包含了目标主题和要发送的内容&#xff0c;同时还可以指定键和分区。在发送 ProducerRecord 对象前&#xff0c;生产者会先把键和值对象序列…

python图像分割算法_OpenCV-Python 图像分割与Watershed算法 | 三十四

目标 在本章中&#xff0c; 我们将学习使用分水岭算法实现基于标记的图像分割 我们将看到&#xff1a;cv.watershed() 理论 任何灰度图像都可以看作是一个地形表面&#xff0c;其中高强度表示山峰&#xff0c;低强度表示山谷。你开始用不同颜色的水(标签)填充每个孤立的山谷(局…

NEO从源码分析看共识协议

2019独角兽企业重金招聘Python工程师标准>>> 0x00 概论 不同于比特币使用的工作量证明&#xff08;PoW&#xff09;来实现共识&#xff0c;NEO提出了DBFT共识算法。DBFT改良自股权证明算法&#xff08;PoS&#xff09;&#xff0c;我没有具体分析过PoS的源码&#x…

怎样在linux系统上安装r,Linux系统之路——如何在CentOS7.2安装R(示例代码)

使用ubuntu的小伙伴们直接使用命令sudo apt-get installr-base-dev或者r-base搞定。然而对于使用centos的我却一直卡在安装这一步&#xff0c;十分的悲催&#xff0c;只有羡慕的份&#xff0c;但也不至于在linux上使用不上R。办法还是有的&#xff0c;自己总结出两种方法&#…

linux部署node web,nodejs怎么部署到Linux上?

nodejs怎么部署到Linux上&#xff1f;下面本篇文章就来给大家介绍一下在Linux上部署nodejs的方法&#xff0c;希望对大家有所帮助。nodejs部署到Linux上的方法如下&#xff1a;(建议先安装xshell和xftp)1、到nodejs官网下载压缩包(选择合适自己系统的版本)&#xff0c;放到Linu…

python树莓派 是什么_用树莓派和Python给你的植物浇水

我想指出&#xff0c;我绝不是电子学专家。如果你让我制作一个电路图或者解释某件电子产品工作原理的细节&#xff0c;我会一无所知。在生活中&#xff0c;我对电力的工作原理有了基本的了解&#xff0c;我只是胡乱摆弄了一下电子元件就完成了这个工程。话虽如此&#xff0c;当…

htmlspecialchars() 函数过滤XSS的问题

htmlspecialchars()函数的功能如下&#xff1a; htmlspecialchars() 函数把预定义的字符转换为 HTML 实体。 预定义的字符是&#xff1a; & &#xff08;和号&#xff09;成为 &" &#xff08;双引号&#xff09;成为 " &#xff08;单引号&#xff09;成为 …

用mac的python写网络爬虫_在mac下使用python抓取数据

2015已经过去&#xff0c;这是2016的第一篇博文&#xff01; 祝大家新年快乐&#xff01; 但是我还有好多期末考试&#xff01; 还没开始复习&#xff0c;唉&#xff0c;一把辛酸泪&#xff01; 最近看了一遍彦祖的文章叫做 所以自己也想小试牛刀.于是便开始动手写,但初次接触,…

運輸配送信息Delivery_Information

为什么80%的码农都做不了架构师&#xff1f;>>> 運輸配送信息Delivery_Information 金銀倉會選用以下運輸公司&#xff0c;為客戶配送磁磚傢俬潔具&#xff1a; 佛山冠昌達中港運輸&#xff08;散貨或包車&#xff0c;近佛山石灣的磁磚倉庫&#xff0c;近樂從傢俬城…