Spring遇見問題(三)-----FreeMarker自定義標籤
阿新 • • 發佈:2019-02-16
web.xml檔案
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation= "http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0"> <display-name>Springmvc3.2.5</display-name> <servlet> <servlet-name>springmvc</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:springmvc-config.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>springmvc</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> </web-app>
springmvc-config.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:p="http://www.springframework.org/schema/p" xmlns:context="http://www.springframework.org/schema/context" xmlns:mvc="http://www.springframework.org/schema/mvc" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd" default-lazy-init="true"> <!-- 註解方式 --> <!-- 自動掃描controller包下的所有類,使其認為spring mvc的控制器 --> <context:component-scan base-package="com.springmvc.controller"/> <context:component-scan base-package="com.springmvc.directive" /> <!-- HandlerMapping --> <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"/> <!-- HandlerAdapter --> <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"/> <!-- ViewResolver --> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/> <property name="prefix" value="/WEB-INF/jsp/"/> <property name="suffix" value=".jsp"/> </bean> <bean class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver"> <property name="prefix" value="" /> <property name="suffix" value=".ftl"/> <property name="contentType" value="text/html;charset=UTF-8"></property> <property name="order" value="0"></property> </bean> <bean id="freemarkerConfig" class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer"> <!-- 其中一下程式碼是用來掃描.ftl的模板檔案,在/WEB-INF/ftl目錄中 --> <property name="templateLoaderPath" value="/WEB-INF/ftl/" /> <property name="freemarkerSettings"> <props> <prop key="template_update_delay">0</prop> <prop key="default_encoding">UTF-8</prop> <prop key="number_format">0.##########</prop> <prop key="datetime_format">yyyy-MM-dd HH:mm:ss</prop> <prop key="classic_compatible">true</prop> <prop key="template_exception_handler">ignore</prop> </props> </property> <!-- 自定義標籤的關聯配置 --> <property name="freemarkerVariables"> <map> <entry key="K2" value-ref="F4" /> <entry key="ShowLsit" value-ref="show_list" /> </map> </property> </bean> </beans>
在com.springmvc.directive包下定義一個標籤類繼承TemplateDirectiveModel
package com.springmvc.directive; import java.io.IOException; import java.util.Map; import static freemarker.template.ObjectWrapper.DEFAULT_WRAPPER; import org.springframework.stereotype.Service; import freemarker.core.Environment; import freemarker.template.SimpleScalar; import freemarker.template.TemplateDirectiveBody; import freemarker.template.TemplateDirectiveModel; import freemarker.template.TemplateException; import freemarker.template.TemplateModel; @Service("F4") public class TestDirective implements TemplateDirectiveModel { /** * * Environment env 當前HTML/FTL的環境引用 * Map params 自定義標籤的屬性引數 * TemplateModel[] loopVars 待處理(暫定為無用) * TemplateDirectiveBody body 標籤體內部內容引用 */ @Override public void execute(Environment env, Map params, TemplateModel[] loopVars, TemplateDirectiveBody body) throws TemplateException, IOException { String text = ""; int length = 0; //獲取F4標籤上的text屬性上的值 if (params.get("text") != null) { text = ((SimpleScalar) params.get("text")).getAsString(); } if (params.get("length") != null) { length = Integer.valueOf(((SimpleScalar) params.get("length")).getAsString()); } if (length < text.length()) { text = "..." + text.substring(text.length() - length); } env.setVariable("key", DEFAULT_WRAPPER.wrap(text)); if (body != null) { body.render(env.getOut()); }else { env.getOut().write(text); } } }
com.springmvc.controller包下定義Controller類
package com.springmvc.controller;
import java.util.ArrayList;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
import com.springmvc.bean.UserBean;
@Controller //①將一個POJO類宣告為處理器
//@RequestMapping(value="/user") //做窄化處理
public class HelloWorldController {
@RequestMapping(value="/hello")
public ModelAndView helloWorld2() {
ModelAndView mv = new ModelAndView();
mv.addObject("message", "AAAAAAA");
mv.setViewName("hello");
return mv;
}
// @RequestMapping(value={"/hello2","/haha","/xixi"})//②請求URL到處理器功能處理方法的對映
// public ModelAndView helloWorld(HttpServletRequest request, HttpServletResponse response, HttpSession session) {
// //1、收集引數//2、繫結引數到命令物件
// //3、呼叫業務物件//4、選擇下一個頁面
// ModelAndView mv = new ModelAndView();
// //新增模型資料可以是任意的POJO物件
// mv.addObject("message", "Hello World!");
// //設定邏輯檢視名,檢視解析器會根據該名字解析到具體的檢視頁面
// mv.setViewName("hello");
// return mv; //3 模型資料和邏輯檢視名
// }
@RequestMapping("/dome")
public ModelAndView freemarkerDome(HttpServletRequest request, HttpServletResponse response, HttpSession session) {
ModelAndView mv = new ModelAndView();
ArrayList<UserBean> list = new ArrayList<>();
UserBean userBean = new UserBean();
userBean.setUser_id("AAA");
userBean.setUser_name("學生");
userBean.setUser_age(21);
list.add(userBean);
userBean = new UserBean();
userBean.setUser_id("BBB");
userBean.setUser_name("小朋友");
userBean.setUser_age(12);
list.add(userBean);
userBean = new UserBean();
userBean.setUser_id("CCC");
userBean.setUser_name("老師");
userBean.setUser_age(50);
list.add(userBean);
mv.addObject("list", list);
mv.setViewName("tt");
return mv;
}
}
指向tt.ftl檔案
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>ftl</title>
</head>
<body>
<div style="border:#F33 2px solid;width:20%;float:left;margin-left:50px;padding: 5px;">
<h2>後臺傳值 list形式取出<br/></h2>
<#list list as user>
userID : ${user.user_id}<br/>
userName : ${user.user_name}<br/>
userAge : #{user.user_age}<br/>
</#list>
</div>
<div style="border:#F33 2px solid;width:20%;float:left;margin-left:50px;padding: 5px;">
<#assign x = "自定義標籤測試" />
<h2>${x}<br/></h2>
<#assign x = 23.45637 />
#{x}<br>
<@K2 text="1234567" length="6">
<input type="text" value=${key}>
</@K2>
<br/>
<@K2 text="TTTTTTTTTTTTT" length="6">
<input type="text" value=${key}>
</@K2>
<br/>
<@K2 text="=============" length="6"></@K2>
</div>
<div style="border:#F33 2px solid;width:20%;float:left;margin-left:50px;padding: 5px;">
<#import "/macrotest.ftl" as BB>
<@BB.page title="巨集練習">
<ul style="color:#F0F;">
<li>spring</li>
<li>j2ee</li>
</ul>
</@BB.page>
</div>
<div style="border:#F33 2px solid;width:20%;float:left;margin-left:50px;padding: 5px;">
<@ShowLsit text="user" value=user stylex="4"></@ShowLsit>
</div>
</body>
</html>
這樣一個整體的配置使用流程就形成了。