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.xsd
        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
        http://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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM