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.pswp.cn/news/539446.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/539446.shtml
英文地址,請注明出處:http://en.pswp.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;”……那…

嵌入式Linux初始化硬件RTC,嵌入式Linux系統中的快速啟動技術研究

嵌入式Linux系統主要特點在于使用Bootloader替代了桌面系統的BIOS&#xff0c;同時對系統進行了規模上的裁剪&#xff0c;但硬件上的劣勢往往導致系統啟動速度較慢&#xff0c;而嵌入式產品使用者又對系統的開機速度比較敏感&#xff0c;樣就產生了對于提高嵌入式Linux系統啟動…

Ajax總結

Ajax的核心技術是XMLHttpRequest對象,它可以在不向服務器提交整個頁面的情況下&#xff0c;實現局部更新網頁。通過這個對象&#xff0c;Ajax可以像桌面應用程序那樣只與服務器進行數據層的交換&#xff0c;而不必每次都刷新界面&#xff0c;也不必每次將數據處理的工作都交給服…

SpringMVC訪問靜態資源的三種方式

如何你的DispatcherServlet攔截 *.do這樣的URL&#xff0c;就不存在訪問不到靜態資源的問題。如果你的DispatcherServlet攔截“/”&#xff0c;攔截了所有的請求&#xff0c;同時對*.js,*.jpg的訪問也就被攔截了。 目的&#xff1a;可以正常訪問靜態文件&#xff0c;不要找不到…

電腦如何進入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;建議你準備收拾包袱跑路吧。既…

視頻通信基礎知識之采集

在之前的文章里&#xff0c;我們說了不少關于音視頻相關的內容&#xff0c;但是一直沒有系統的來介紹視頻通信&#xff0c;接下來我們將出一個系列關于視頻通信的文章。幫助大家對視頻通信有一個更全面的認識。系列文大綱如下&#xff1a;視頻通信采集視頻通信處理視頻通信編碼…

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;生產者會先把鍵和值對象序列…

linux 硬盤繁忙,icinga2 借助check_iostat.sh抓取linux服務器的diskIO(硬盤繁忙度)

icinga2 借助check_iostat.sh抓取linux服務器的diskIO(硬盤繁忙度)下載地址&#xff1a;https://exchange.nagios.org/directory/Plugins/Operating-Systems/Linux/Check-Iostat-Updated/details對腳本進行修改(默認為$12&#xff0c;12為w_await值&#xff0c;14為%util值)UTI…

centos7安裝kubernetes1.9集群

節點規劃 本次選用一個master節點&#xff0c;三個node節點來安裝k8s集群。   節點IPM010.xx.xx.xxN010.xx.xx.xxN110.xx.xx.xxN210.xx.xx.xx集群啟動前的準備(請用root用戶執行) 節點準備工作(在每臺機器上執行) 包括修改主機名&#xff0c;關閉防火墻等操作。  k8s集群會…

oracle中查詢某張表的大小

select sum(bytes)/1024/1024 "表大小(M)" from user_segments where segment_nametable_name;--注&#xff0c;僅表數據的大小&#xff0c;不含索引、分區、LOB類型 select Segment_Name,Sum(bytes)/1024/1024 From User_Extents Group By Segment_Name having Segm…

python圖像分割算法_OpenCV-Python 圖像分割與Watershed算法 | 三十四

目標 在本章中&#xff0c; 我們將學習使用分水嶺算法實現基于標記的圖像分割 我們將看到&#xff1a;cv.watershed() 理論 任何灰度圖像都可以看作是一個地形表面&#xff0c;其中高強度表示山峰&#xff0c;低強度表示山谷。你開始用不同顏色的水(標簽)填充每個孤立的山谷(局…