javascript
SpringMVC+FreeMarker
?前言:
最近在學(xué)習(xí)SpringMVC,模板引擎用的是FreeMarker,之前沒有接觸過。利用SpringMVC開發(fā)其實(shí)還有許多的步驟,比如控制層,服務(wù)層,持久化層,實(shí)體等等,先弄了一個(gè)小demo來總結(jié)一下SpringMVC的開發(fā)流程。
一、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配置文件位置 不指定使用默認(rèn)情況 --><init-param><param-name>contextConfigLocation</param-name><param-value>/WEB-INF/spring-mvc.xml,classpath*:/applicationContext.xml</param-value></init-param><!-- 設(shè)置啟動(dòng)順序 --><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"><!-- 自動(dòng)掃描且只掃描@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的默認(rèn)編碼設(shè)為UTF-8 --><bean class="org.springframework.http.converter.StringHttpMessageConverter"><constructor-arg value="UTF-8" /></bean><!-- 將Jackson2HttpMessageConverter的默認(rèn)格式化輸出設(shè)為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> <!-- 容器默認(rèn)的DefaultServletHandler處理 所有靜態(tài)內(nèi)容與無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);}}四、實(shí)體類
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/項(xiàng)目名稱/home/getUser
七、流程說明
摘自:http://jinnianshilongnian.iteye.com/blog/1594806
1、? 首先用戶發(fā)送請求——>DispatcherServlet,前端控制器收到請求后自己不進(jìn)行處理,而是委托給其他的解析器進(jìn)行處理,作為統(tǒng)一訪問點(diǎn),進(jìn)行全局的流程控制;
2、? DispatcherServlet——>HandlerMapping, HandlerMapping將會把請求映射為HandlerExecutionChain對象(包含一個(gè)Handler處理器(頁面控制器)對象、多個(gè)HandlerInterceptor攔截器)對象,通過這種策略模式,很容易添加新的映射策略;
3、? DispatcherServlet——>HandlerAdapter,HandlerAdapter將會把處理器包裝為適配器,從而支持多種類型的處理器,即適配器設(shè)計(jì)模式的應(yīng)用,從而很容易支持很多類型的處理器;
4、? HandlerAdapter——>處理器功能處理方法的調(diào)用,HandlerAdapter將會根據(jù)適配的結(jié)果調(diào)用真正的處理器的功能處理方法,完成功能處理;并返回一個(gè)ModelAndView對象(包含模型數(shù)據(jù)、邏輯視圖名);
5、? ModelAndView的邏輯視圖名——> ViewResolver, ViewResolver將把邏輯視圖名解析為具體的View,通過這種策略模式,很容易更換其他視圖技術(shù);
6、? View——>渲染,View會根據(jù)傳進(jìn)來的Model模型數(shù)據(jù)進(jìn)行渲染,此處的Model實(shí)際是一個(gè)Map數(shù)據(jù)結(jié)構(gòu),因此很容易支持其他視圖技術(shù);渲染的過程用到了相應(yīng)的視圖解析器,關(guān)于視圖解析器的優(yōu)先級的配置(http://www.cnblogs.com/rollenholt/archive/2012/12/27/2836035.html)。本例中,得到的默認(rèn)視圖解析器是FreeMarker的視圖解析器,然后根據(jù)ModelAndView中的viewName或者Controler的返回值(對應(yīng)ftl模板的名字)到FreeMarkerConfigurer配置的templateLoaderPath目錄下尋找對應(yīng)的模板文件,然后進(jìn)行渲染。
7、返回控制權(quán)給DispatcherServlet,由DispatcherServlet返回響應(yīng)給用戶,到此一個(gè)流程結(jié)束。
注:如果想要更清楚SpringMVC的流程,就要看一下DispatcherServlet的源碼。
?
學(xué)習(xí)中遇到的問題:http://www.cnblogs.com/hujunzheng/p/5293050.html
轉(zhuǎn)載于:https://www.cnblogs.com/hujunzheng/p/5292769.html
總結(jié)
以上是生活随笔為你收集整理的SpringMVC+FreeMarker的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 风疹病毒抗体测定igg阳性是什么意思(什
- 下一篇: 命令行fuck神器