SpringMVC+FreeMarker

?前言:

   最近在學習SpringMVC,模板引擎用的是FreeMarker,之前沒有接觸過。利用SpringMVC開發其實還有許多的步驟,比如控制層,服務層,持久化層,實體等等,先弄了一個小demo來總結一下SpringMVC的開發流程。

一、web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app id="WebApp_ID" version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"><servlet><!-- 配置DispatcherServlet --><servlet-name>springmvc</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><!-- 指定spring mvc配置文件位置 不指定使用默認情況 --><init-param><param-name>contextConfigLocation</param-name><param-value>/WEB-INF/spring-mvc.xml,classpath*:/applicationContext.xml</param-value></init-param><!-- 設置啟動順序 --><load-on-startup>1</load-on-startup></servlet><!-- 配置映射 servlet-name和DispatcherServlet的servlet一致 --><servlet-mapping><servlet-name>springmvc</servlet-name><url-pattern>/</url-pattern><!-- 攔截以/所有請求 --></servlet-mapping><welcome-file-list><welcome-file>index.jsp</welcome-file></welcome-file-list>
</web-app>

二、spring-mvc.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:mvc="http://www.springframework.org/schema/mvc"xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsdhttp://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd"><!-- 自動掃描且只掃描@Controller --><context:component-scan base-package="uap.web,uap.iweb" use-default-filters="false"><context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/><context:include-filter type="annotation" expression="org.springframework.web.bind.annotation.ControllerAdvice"/></context:component-scan><mvc:annotation-driven><mvc:message-converters register-defaults="true"><!-- 將StringHttpMessageConverter的默認編碼設為UTF-8 --><bean class="org.springframework.http.converter.StringHttpMessageConverter"><constructor-arg value="UTF-8" /></bean><!-- 將Jackson2HttpMessageConverter的默認格式化輸出設為true --><bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"><property name="prettyPrint" value="true"/></bean>            </mvc:message-converters></mvc:annotation-driven><!-- freemarker的配置 -->  <bean id="freemarkerConfigurer"  class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">  <property name="templateLoaderPath" value="/WEB-INF/views/" />  <property name="defaultEncoding" value="UTF-8" />  <property name="freemarkerSettings">  <props>  <prop key="template_update_delay">10</prop>  <prop key="locale">zh_CN</prop>  <prop key="datetime_format">yyyy-MM-dd HH:mm:ss</prop>  <prop key="date_format">yyyy-MM-dd</prop></props>  </property>  <property name="freemarkerVariables"><map>  <entry key="ctx" value="/web_example" />                </map>            </property></bean>      <!-- FreeMarker視圖解析器 -->  <bean id="viewResolver"  class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver">  <property name="viewClass"  value="org.springframework.web.servlet.view.freemarker.FreeMarkerView" />  <property name="suffix" value=".ftl" />  <property name="contentType" value="text/html;charset=UTF-8" />  <property name="exposeRequestAttributes" value="true" />  <property name="exposeSessionAttributes" value="true" />  <property name="exposeSpringMacroHelpers" value="true" />  <property name="requestContextAttribute" value="request" /></bean>  <!-- 定義JSP文件的位置 --> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"><property name="prefix" value="/WEB-INF/views/"/><property name="suffix" value=".jsp"/></bean>    <!-- 容器默認的DefaultServletHandler處理 所有靜態內容與無RequestMapping處理的URL-->    <mvc:default-servlet-handler/>
</beans>

三、Controler類

@Controller
@RequestMapping("/home")
public class FreeMarkerController {@RequestMapping("/getUser")public ModelAndView Add(HttpServletRequest request, HttpServletResponse response) {User user = new User();user.setUsername("hjzgg");user.setPassword("5211314");List<User> users = new ArrayList<User>();users.add(user);return new ModelAndView("index", "users", users);}}

四、實體類

public class User {private String username;private String password;public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}}

五、ftl模板(index.ftl)

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>yonyou</title>
</head>
<body><#list users as user>username : ${user.username}<br/>password : ${user.password}</#list>
</body>
</html>

?

六、訪問路徑

  http://localhost:port/項目名稱/home/getUser

七、流程說明

  摘自:http://jinnianshilongnian.iteye.com/blog/1594806

1、? 首先用戶發送請求——>DispatcherServlet,前端控制器收到請求后自己不進行處理,而是委托給其他的解析器進行處理,作為統一訪問點,進行全局的流程控制;

2、? DispatcherServlet——>HandlerMapping, HandlerMapping將會把請求映射為HandlerExecutionChain對象(包含一個Handler處理器(頁面控制器)對象、多個HandlerInterceptor攔截器)對象,通過這種策略模式,很容易添加新的映射策略;

3、? DispatcherServlet——>HandlerAdapter,HandlerAdapter將會把處理器包裝為適配器,從而支持多種類型的處理器,即適配器設計模式的應用,從而很容易支持很多類型的處理器;

4、? HandlerAdapter——>處理器功能處理方法的調用,HandlerAdapter將會根據適配的結果調用真正的處理器的功能處理方法,完成功能處理;并返回一個ModelAndView對象(包含模型數據、邏輯視圖名);

5、? ModelAndView的邏輯視圖名——> ViewResolver, ViewResolver將把邏輯視圖名解析為具體的View,通過這種策略模式,很容易更換其他視圖技術;

6、? View——>渲染,View會根據傳進來的Model模型數據進行渲染,此處的Model實際是一個Map數據結構,因此很容易支持其他視圖技術;渲染的過程用到了相應的視圖解析器,關于視圖解析器的優先級的配置(http://www.cnblogs.com/rollenholt/archive/2012/12/27/2836035.html)。本例中,得到的默認視圖解析器是FreeMarker的視圖解析器,然后根據ModelAndView中的viewName或者Controler的返回值(對應ftl模板的名字)到FreeMarkerConfigurer配置的templateLoaderPath目錄下尋找對應的模板文件,然后進行渲染。

7、返回控制權給DispatcherServlet,由DispatcherServlet返回響應給用戶,到此一個流程結束。

  注:如果想要更清楚SpringMVC的流程,就要看一下DispatcherServlet的源碼。

?

  學習中遇到的問題:http://www.cnblogs.com/hujunzheng/p/5293050.html

轉載于:https://www.cnblogs.com/hujunzheng/p/5292769.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/531338.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/531338.shtml
英文地址,請注明出處:http://en.pswp.cn/news/531338.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

SpringMVC那點事

一、SpringMVC返回json數據的三種方式 1、第一種方式是spring2時代的產物&#xff0c;也就是每個json視圖controller配置一個Jsoniew。 如&#xff1a;<bean id"defaultJsonView" class"org.springframework.web.servlet.view.json.MappingJacksonJsonView&q…

js學習內容的整理

1、jquery動態添加Table中的一行 function addTableRow(tableId){var html <tr>\......\</tr>";//行首插入一行if($(#tableId).find(tr).length 1){$(html).insertAfter($(#tableId).find(tr).eq(0));} else { $(html).insertBefore($(#tableId).find(tr).e…

(一)最鄰近插值python實現

這里寫目錄標題&#xff08;一&#xff09;原始圖像&#xff08;二&#xff09;最鄰近插值實現&#xff08;三&#xff09;python實現1. 安裝庫2. python程序編寫3. 效果4. 工程文件&#xff08;一&#xff09;原始圖像 &#xff08;二&#xff09;最鄰近插值實現 一般情況下我…

(二)雙線性插值python實現

這里寫目錄標題&#xff08;一&#xff09;原始圖像&#xff08;二&#xff09;雙線性插值原理&#xff08;三&#xff09;python實現1. 安裝庫2. python程序編寫3. 效果4. 工程文件&#xff08;一&#xff09;原始圖像 &#xff08;二&#xff09;雙線性插值原理 一般情況下我…

js self = this的解釋

Demo 1: function Person(){this.name hjzgg;this.age 24;this.show function(){alert(name " " age);}}var p new Person();p.show(); 錯誤&#xff1a;name 和 age都沒有定義。 Demo 2: function Person(){this.name hjzgg;this.age 24;this.show functio…

(三)圖像轉灰度圖Python實現

這里寫目錄標題&#xff08;一&#xff09;原始圖像&#xff08;二&#xff09;轉換原理&#xff08;三&#xff09;python實現1. 安裝庫2. python程序編寫3. 效果4. 工程文件&#xff08;一&#xff09;原始圖像 &#xff08;二&#xff09;轉換原理 &#xff08;三&#xff…

SD卡實例分析fat32文件系統

目錄 環境描述 分析過程 1.SD卡格式化 2.使用winhex打開sd卡 3.MBR分析 4.DBR分析

java泛型上下限

前言&#xff1a; java的泛型上下限不是很好理解&#xff0c;尤其像我這種菜雞。反反復復看了好幾遍了...&#xff0c;真是... 一、簡單的繼承體系 class Person{}class Student extends Person{}class Worker extends Person{} 二、泛型上限&#xff08;extends 關鍵字&#x…

基于matlab的步進電機仿真(一)

這里寫目錄標題環境準備基礎準備模型參數輸入和輸出仿真原理圖仿真資源環境準備 MatLab2021b 基礎準備 打開Matlab&#xff0c;在幫助文檔里面搜索step motor,我們這里選擇如下模型 該模型實現了一個通用的步進電機模型&#xff1a; 可變磁阻步進電機永磁或混合步進電機 …

java自定義類加載器

前言 java反射&#xff0c;最常用的Class.forName()方法。做畢設的時候&#xff0c;接收到代碼字符串&#xff0c;通過 JavaCompiler將代碼字符串生成A.class文件&#xff08;存放在classpath下&#xff0c;也就是eclipse項目中的bin目錄里&#xff09;&#xff0c;然后通過jav…

常用網址

MDN : 一個不錯的前端學習網站 https://developer.mozilla.org/zh-CN/  https://developer.mozilla.org/en-US/ CodePen 是一個網站前端設計開發平臺&#xff0c;是一個針對網站前端代碼設計的開發工具。 RunJS - 在線編輯、展示、分享、交流你的 JavaScript 代碼 : http://r…

repo介紹(一)

repo簡介 Repo 是我們以 Git 為基礎構建的代碼庫管理工具,可以組織多個倉庫的上傳和下載。它是由一系列的Python腳本組成&#xff0c;封裝了一系列的Git命令&#xff0c;用來統一管理多個Git倉庫 一個大型的項目可能由很多小的倉庫組合而成的&#xff0c;為了方便統一管理各個…

hash長度擴展攻擊

作為一個信息安全的人&#xff0c;打各個學校的CTF比賽是比較重要的&#xff01; 最近一個朋友發了道題目過來&#xff0c;發現有道題目比較有意思&#xff0c;這里跟大家分享下 這串代碼的大致意思是&#xff1a; 這段代碼首先引入了一個名為"flag.php"的文件&am…

repo介紹(二)

這篇文章來實例操作 安裝repo&#xff0c;參考repo介紹這一節創建repo存放default.xml 的git倉庫 初始化repo&#xff0c;repo init -u https://gitee.com/angerial/repo-test.git 這個時候會在當前目錄生成如下文件 參考repo組成&#xff0c;修改.repo/manifest.xml,這里我的…

springmvc環境搭建以及常見問題解決

1.新建maven工程 a) 打開eclipse&#xff0c;file->new->project->Maven->Maven Project b) 下一步 c) 選擇創建的工程為webapp&#xff0c;下一步 d) 填寫項目的group id和artifact id。一般情況下&#xff0c;group id寫域名的倒序&#xff0c;artifact id…

eclipse build workspace太慢或者 js出錯問題解決

1.js文件錯誤解決辦法 右鍵項目->properties->Builders(注&#xff1a;JavaScript Validator也會引起 build workspace太慢) 2.Eclipse 一直不停 building workspace完美解決總結&#xff08;來自: http://blog.163.com/shadow_wolf/blog/static/18346909720145279519222…

HttpUrlConnection發送url請求(后臺springmvc)

1.HttpURLConnection發送url請求 public class JavaRequest {private static final String BASE_URL "http://localhost:8080/dsdemo/";public static String userToken null;public static String problemName null;public static String sendPost(String sufUrl…

springmvc+jpa實現分頁的兩種方式

1.工具類 public final class QueryTool {public static PageRequest buildPageRequest(int pageNumber, int pageSize, String sortType){Sort sort null;if("auto".equals(sortType)) {sort new Sort(Direction.DESC, "ctime");} else {sort new Sort…

不使用session,借助redis實現驗證碼

1.首先看一下基本的流程 2.看一下代碼 注&#xff1a;其中用到的一些工具類&#xff0c;可以到我的github上去下載 https://github.com/hjzgg/usually_util/tree/master/utils windows 下的 redis下載 https://github.com/hjzgg/redis 獲取驗證碼的tooken RequestMapping(value…

PS批處理的使用

一、 前言 做開發的時候&#xff0c;最多的時候就是圖片的使用了。有時候圖片的處理都按照同樣的步驟&#xff0c;比如說統一將圖片的大小調整為固定大小&#xff0c;或者統一在所有的圖片的的某個位置上加入文字或者小圖片等等&#xff0c;這時候PS的批處理可以幫你完成這些重…