`
jin8000608172
  • 浏览: 140761 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

freemarker实现通用分页,首页静态化,通用select,通用文章显示

阅读更多
freemarker工具类:
package org.konghao.freemarker;

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Map;

import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.TemplateException;

public class FreemarkerUtil {
	//getTemplate("01.ftl")
	public Template getTemplate(String name) {
		try {
			//通过Freemaker的Configuration读取相应的ftl
			Configuration cfg = new Configuration();
			//设定去哪里读取相应的ftl模板文件
			cfg.setClassForTemplateLoading(this.getClass(),"/ftl");
			//在模板文件目录中找到名称为name的文件
			Template temp = cfg.getTemplate(name);
			return temp;
		} catch (IOException e) {
			e.printStackTrace();
		}
		return null;
	}
	
	public void print(String name,Map<String,Object> root) {
		try {
			//通过Template可以将模板文件输出到相应的流
			Template temp = this.getTemplate(name);
			temp.process(root, new PrintWriter(System.out));
		} catch (TemplateException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	
	public void fprint(String name,Map<String,Object> root,String outFile) {
		FileWriter out = null;
		try {
			//通过一个文件输出流,就可以写到相应的文件中
			out = new FileWriter(new File("D:\\webservice\\ftl\\"+outFile));
			Template temp = this.getTemplate(name);
			temp.process(root, out);
		} catch (IOException e) {
			e.printStackTrace();
		} catch (TemplateException e) {
			e.printStackTrace();
		} finally {
			try {
				if(out!=null) out.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}
	
}


freemarker测试类:
package org.konghao.freemarker.test;

import java.util.Arrays;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.junit.Before;
import org.junit.Test;
import org.konghao.freemarker.FreemarkerUtil;
import org.konghao.freemarker.model.Article;
import org.konghao.freemarker.model.Channel;
import org.konghao.freemarker.model.Student;
import org.konghao.freemarker.model.User;

public class TestFreemarker {
	FreemarkerUtil fu;
	Map<String,Object> root = null;
	
	@Before
	public void setUp() {
		fu = new FreemarkerUtil();
		root = new HashMap<String,Object>();
	}
	
	@Test
	public void test01() {
		//1、创建数据模型
		Map<String,Object> root = new HashMap<String,Object>();
		//2、为数据模型添加值
		root.put("username", "张三");
		//3、将数据模型和模板组合的数据输出到控制台
		fu.print("01.ftl", root);
		fu.fprint("02.ftl", root, "01.html");
	}
	
	@Test
	public void test02() {
		//freemarker还可以输出相应的对象
		root.put("user", new User(1,"李四",16));
		sprint("03.ftl");
		fprint("03.ftl","03.html");
	}
	
	@Test
	public void test04() {
		List<User> users = Arrays.asList(new User(1,"张三",22),new User(2,"李四",33));
		root.put("users",users);
		sprint("04.ftl");
		fprint("04.ftl","04.html");
	}
	
	@Test
	public void test05() {
		root.put("username", "管理员");
		List<User> users = Arrays.asList(new User(1,"张三",22),new User(2,"李四",33));
		root.put("users",users);
		sprint("05.ftl");
		fprint("05.ftl","05.html");
	}
	
	@Test
	public void test06() {
		
		//此时user对象并没有group的值,这时如果在页面显示group直接报错
		//freemarker不会处理空值
		root.put("user",new User(1,"地点",22));
		sprint("06.ftl");
	}
	
	@Test
	public void test07() {
		root.put("now",new Date());
		root.put("username", "李四");
		sprint("07.ftl");
		fprint("07.ftl", "07.html");
	}
	
	@Test
	public void test08() {
		sprint("08.ftl");
	}
	
	@Test
	public void test09() {
		sprint("09.ftl");
	}
	
	@Test
	public void test10() {
		root.put("username","张三");
		sprint("10.ftl");
	}
	
	@Test
	public void test11() {
		sprint("11.ftl");
	}
	
	@Test
	public void test12() {
		List<User> users = Arrays.asList(new User(1,"张三",22),
						new User(2,"李四",33),
						new User(3,"王五",44));
		root.put("users",users);
		List<Student> stus = Arrays.asList(new Student("123123", "地点"),new Student("11111","方法"));
		root.put("stus", stus);
		sprint("12.ftl");
		fprint("12.ftl","12.html");
	}
	
	@Test
	public void test13() {
		sprint("13.ftl");
		fprint("13.ftl","13.html");
	}
	
	@Test
	public void test14() {
		Map<String,List<Article>> arts = new HashMap<String,List<Article>>();
		List<Article> a1 = Arrays.asList(new Article("说给焦点方法各家阿斯顿发贺卡就是地方贺卡设计", new Channel(1, "多对多")),
						new Article("看似简单干净啊", new Channel(1, "多对多")),
						new Article("阿斯达卡说得好斯蒂芬斯蒂芬", new Channel(1, "多对多")),
						new Article("阿阿斯顿撒上所说的话", new Channel(1, "多对多")),
						new Article("是地方贺卡设计", new Channel(1, "多对多")),
						new Article("斯诺克打击***建设的", new Channel(1, "多对多")));
		arts.put("1", a1);
		
		List<Article> a2 = Arrays.asList(new Article("你说的就是公司根据阿卡什打电话", new Channel(1, "多对多")),
				new Article("个撒旦发撒旦发的时候", new Channel(1, "多对多")),
				new Article("个很好的方法斯蒂芬斯蒂芬个", new Channel(1, "多对多")),
				new Article("阿撒旦发撒旦发上所说的话", new Channel(1, "多对多")),
				new Article("是地方贺卡设计阿斯达卡的方法撒旦发撒旦发", new Channel(1, "多对多")),
				new Article("阿斯顿发撒旦发撒旦发撒旦和斯诺克打击***建设的", new Channel(1, "多对多")));
		arts.put("2", a2);
		root.put("arts",arts);
		sprint("14.ftl");
		fprint("14.ftl","14.html");
	}
	
	private void sprint(String name) {
		fu.print(name, root);
	}
	private void fprint(String name,String filename) {
		fu.fprint(name, root, filename);
	}
}

ftl文件:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<#macro showArt cid titleNum>
	<#nested>
	<#local articles=arts[cid]/>
	<#list articles as art>
		<li><span><a href="">
		<#if (art.title?length>titleNum)>
			${art.title[0..titleNum]}...
		<#else>
			${art.title}
		</#if>
		</span></a>
		</li>
	</#list>
</#macro>

<@showArt cid="1" titleNum=7>
	<h1>水水水水水水</h1>
</@showArt>


<@showArt cid="2" titleNum=10>
	<h1>活活后发货后会</h1>
</@showArt>
</body>
</html>


<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<#import "/inc/pager.ftl" as my/>
<@my.pager url="#" totalPage=150 curPage=14 class="pagers" showPageNum=20/>

</body>
</html>


<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<#import "/inc/select.ftl" as my/>
<@my.select id="address" datas=["北京","天津","上海"]/>
<@my.select id="sex" datas=["选择性别","男","女"] value="男"/>
<@my.select id="username" datas=users key="id" text="name" 
		headkey="-1" headtext="请选择用户"/>

<@my.select id="stu" datas=stus key="no" text="name" 
		headkey="-1" headtext="请选择学生"/>

<@my.select id="sex" datas={"0":"男","1":"女"} value="1"/>
</body>
</html>


<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<#--
	使用incldue可能会出现覆盖的问题,可以使用import来完成导入,并且加入名称空间
	<#include "/inc/inc1.ftl"/>
	<#include "/inc/inc2.ftl"/>
-->
<#import "/inc/inc2.ftl" as inc2/>
<#import "/inc/inc1.ftl" as inc1/>
	${inc2.username}
	${inc1.username}
<#--将一个变量定义到名称空间中-->
<#assign age=12 in inc2/>
${inc2.age}
<#--访问名称空间中的自定义指令-->
<@inc1.test/>
</body>
</html>


<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>

<#assign username="李四">
<#--此时模板中的变量的名称和模型中的变量名称一致,不是覆盖,而是隐藏-->
${username}
<#--使用.globals可以访问模型中的变量-->
${.globals.username}
<#macro test>
<#--此时当调用该指令之后,会将模板中的变量username覆盖为王五
所以这种方式存在风险,所以一般不使用这种方式在指令中定义变量-->
	<#--<#assign username="王五"/>-->
	<#--使用local可以声明局部变量,所以在marco中非特殊使用局部变量-->
	<#local username="王五"/>
	${username}
</#macro>
<@test/>
${username}
<#list 1..3 as username>
<#--循环中的变量出了循环就消失-->
	${username}
</#list>
${username}
</body>
</html>


<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<#--对于hello这个自定义指令而言,hello后的都是参数,有两个参数一个是num一个是ok-->
<#macro hello num ok>
	<#list 1..num as n>
		<h1>Hello${ok}${n}</h1>
	</#list>
</#macro>

<#--<@hello/>会报错,因为hello有两个参数,在定义参数的值的时候参数名不能省略-->
<@hello num=3 ok="World"/>

<#--为repeat的两个参数定义了初始值,此时在调用该指令就可以省略参数,如果省略会使用默认值-->
<#macro repeat num=10 ok="World">
	<#list 1..num as n>
		<h1>Hello${ok}${n}</h1>
	</#list>
</#macro>

<@repeat/>

<#macro test>
	<#--nested会输出指令中的内容-->
	<#nested 12 33/>
	<#nested 11 22/>
	<#nested 22 33/>
</#macro>

<@test;x,y>
	<h1>你好啊--${x}--${y}</h1>
</@test>
</body>
</html>


<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<#assign nums=[1,3,4,56,33,43]/>
${nums?first}
<#--特别注意,以下定义不使用[12..200]-->
<#assign nums=12..200/><#--定义了一个连续的序列从12到199-->
<#--序列的拆分-->
<#assign nums1=nums[1..10]>
<#list nums1 as num>
${num}
</#list>
${"你好,你来了吗今天看书了吗!"[0..8]}...
<#assign maps={"1":"张三","2":"李四"}>
${maps["1"]}
<#--以下代码可以将map的key转换为相应的序列-->
<#assign keys=maps?keys>
<#list keys as key>
${key}---${maps[key]}

<#assign users={"username":"张三","password":"123"}>
${users.username}---${users["password"]}
</#list>
</body>
</html>


<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<#--定义变量-->
<#assign username="张三"/>
${username}
<#--定义了一个数字-->
<#assign num=10>
${num+11}
<#assign str="10"/>
${str+11}
<#--值会完成覆盖-->
<#assign str=33/>
${str+11}
<#assign b=true/>
<#--不能直接输出数字或者字符串以外的类型,否则都会报错,需要转换为字符串才能输出
	使用xxx?string可以完成对字符串的转换
-->
<#--${b}-->
${b?string}
${(a.d)???string}
<#--日期也不能直接输出,需要转换为字符串-->
${now?string("yyyy-MM-dd HH:mm:ss")}
<#--${now?string}没有为日期设定格式也会报错-->

<#--以下显示了使用字符链接和插值的方式连接字符串-->
${"hello"+username}

${"hello${username}"}

<#--字符串转换为日期
data用来转换日期,datatime用来转换日期和时间,time用来转换时间
-->
<#assign bir="1979-12-02 12:22:33"?date("yyyy-MM-dd HH:mm:ss")>
<#assign bir="1979-12-02 12:22:33"?datetime("yyyy-MM-dd HH:mm:ss")>
${bir}

${"<br/>"?html}

[${"abcde"?left_pad(10,"--")}]

${1.4?string(0)}
${1.8?int}
</body>
</html>


<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
${user.id}-------${user.name}------${user.group!}
<#--${user.group.name!}--><#-- 按照以上的方式加! freemarker仅仅只会判断group.name是不是空值 -->
${(user.group.name)!"没有任何值存在"}

${(a.b)!"没有a.b元素"}

<#if (a.b)??>
	不为空
<#else>
	为空
</#if>
</body>
</html>


<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<#include "/inc/top.ftl"/>
<hr/>
<#list users as user>
${user.id}---------${user.name}-------${user.age}<br/>
</#list>
</body>
</html>


<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<#list users as user>
${user.id}---------${user.name}-------${user.age}<br/>
</#list>
</body>
</html>


<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>${user.id}-----${user.name}-----${user.age}</h1>
<#if user.age lt 12>
	${user.name}还是一个小孩
<#elseif user.age lt 18>
	${user.name}快成年
<#else>
	${user.name}已经成年
</#if>
</body>
</html>


<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>${username}</h1>
</body>
</html>


你好:${username}


<#assign username="张三">

<#macro test>
	hello world
</#macro>


<#assign username="李四">


<#macro pager url totalPage curPage=1 class="" showPageNum=15>
	<#local halfPage=(showPageNum/2)?int/>
	${halfPage}
	<#if (halfPage>=curPage)>
		<@showPage start=1 end=curPage url=url class=class curPage=curPage/>
		<@showPage start=curPage+1 end=showPageNum curPage=curPage url=url class=class/>
	<#else>
		<@showPage start=curPage-halfPage end=curPage url=url class=class curPage=curPage/>
		<#if (curPage+halfPage>totalPage)>
			<#local endPage=totalPage/>
		<#else>
			<#local endPage=curPage+halfPage/>
		</#if>
		<@showPage start=curPage+1 end=endPage url=url class=class curPage=curPage/>
	</#if>
</#macro>

<#macro showPage start end curPage url class>
	<#list start..end as page>
		<#if curPage==page>
			[${page}]
		<#else>
			<a href="${url}" class="${class}">${page}</a>
		</#if>
	</#list>
</#macro>


<#macro select id datas value="" key="" text="" headkey="" headtext="">
	<select id="${id}" name="${id}">
	<#if headkey!="">
	<option value="${headkey}">${headtext}</option>
	</#if>
	<#if datas?is_hash_ex>
	<#local keys=datas?keys/>
	<#list keys as key>
		<#if key==value>
			<option value="${key}" selected>${datas[key]}</option>
		<#else>
			<option value="${key}">${datas[key]}</option>
		</#if>
	</#list>
	<#else>
		<#list datas as data>
			<#if key!="">
				<#if value==data[key]?string>
					<option value="${data[key]}" selected>${data[text]}</option>
				<#else>
					<option value="${data[key]}">${data[text]}</option>
				</#if>
			<#else>
				<#if value==data>
					<option value="${data}" selected>${data}</option>
				<#else>
					<option value="${data}">${data}</option>
				</#if>
			</#if>
		</#list>	
	</#if>
	</select>
</#macro>


<h1>欢迎${username}访问我们的系统</h1>


pom.xml文件
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>org.konghao.freemarker</groupId>
  <artifactId>freemarker-hello</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <packaging>jar</packaging>

  <name>freemarker-hello</name>
  <url>http://maven.apache.org</url>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  </properties>

  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.7</version>
      <scope>test</scope>
    </dependency>
    <dependency>
	  <groupId>org.freemarker</groupId>
	  <artifactId>freemarker</artifactId>
	  <version>2.3.19</version>
	</dependency>
  </dependencies>
</project>



fre-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:mvc="http://www.springframework.org/schema/mvc"
	xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.1.xsd
		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">

	<mvc:annotation-driven />
	<context:component-scan base-package="org.konghao.fre.controller"></context:component-scan>

	<mvc:resources location="/resources/" mapping="/resources/**" />
	
	<bean id="freemarkerConfig" class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">
 		 <property name="templateLoaderPath" value="/WEB-INF/ftl/"/>
	</bean>
	<bean id="viewResolver" class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver">
  		<property name="cache" value="true"/>
 		<property name="prefix" value=""/>
  		<property name="suffix" value=".ftl"/>
  		<property name="contentType" value="text/html; charset=UTF-8"></property>
	</bean>
	
	<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>
		<property name="suffix" value=".jsp"></property>
	</bean>
	
	<bean class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver">
		<property name="mediaTypes">
			<map>
				<entry key="json"  value="application/json" />
				<entry key="xml" value="text/xml" />
				<entry key="htm" value="text/html" />
			</map>
		</property>
		<property name="defaultContentType" value="text/html" />
	</bean>
</beans>


分享到:
评论
2 楼 Imini123 2015-09-25  
[align=center][color=red][/color]
[/align]
1 楼 Seanman 2015-02-10  
初学freemarker,源码不全,不知道怎么用

相关推荐

    FreeMarker通用的分页

    在FreeMarker中实现通用的分页功能是提高Web应用程序性能和用户体验的重要一环。 ### FreeMarker通用分页知识点解析 #### 1. 分页宏(Macro)定义 FreeMarker中的宏允许我们封装可重用的代码块,这在实现通用分页...

    httpclient,freemarker的静态化分页

    本项目利用了`httpclient`与`freemarker`这两个工具来实现静态化的分页功能。下面将详细阐述这两个工具以及它们在静态化分页中的应用。 首先,`httpclient`是Apache的一个开源HTTP客户端库,它提供了丰富的API,...

    freemarker 实现宏分页

    然而,在网上关于FreeMarker如何实现宏分页的教程相对较少。因此,我们来详细探讨一下如何在FreeMarker中使用宏来实现分页功能。 首先,理解FreeMarker宏的概念。在FreeMarker模板语言中,宏类似于HTML中的自定义...

    struts1.2+freemarker实现登录成功页面静态化例子

    总结来说,这个例子展示了如何结合Struts1.2和Freemarker2.3.8实现登录成功页面的静态化,通过静态化可以提高网站性能,减轻服务器负担,提升用户体验。在实际开发中,开发者可以根据项目需求灵活运用这些技术和策略...

    Freemarker通用select下拉框

    本示例关注的是如何在Freemarker(FTL)中创建一个通用的`select`下拉框,以满足各种Web界面中的下拉选择需求。通过单元测试确保其灵活性和可复用性。 首先,理解`select`下拉框在HTML中的基本结构,它由`&lt;select&gt;`...

    freemarker自定义的通用分页指令(标签)源码和使用示例

    一个用FTL定义的非常通用数据分页指令,有源码,有使用示例。使用效果图可以参看本人博客中的相关文章:http://blog.csdn.net/qjyong/archive/2009/10/18/4693142.aspx

    freemarker的分页功能

    标题与描述概述的知识点主要集中在Freemarker模板引擎在实现分页功能时的应用,特别是当后端数据库为MySQL的情况下。Freemarker是一个用于生成动态文本的模板引擎,它被广泛应用于Web开发中,用于将数据模型转换成...

    高级Java人才培训专家-02-文章列表查看、Freemarker+minio 文章详情静态化、ES全文检索

    - 实现文章列表时,需要考虑滚屏分页的逻辑。这种逻辑通常包括上拉加载更多和下拉刷新两种操作。 - **上拉加载更多**:根据当前页面中发布时间最小的文章作为基准,加载后续的文章。 - **下拉刷新**:根据当前...

    SpringBoot2 整合FreeMarker模板,完成页面静态化处理.docx

    【SpringBoot2 整合FreeMarker模板,完成页面静态化处理】 在Web开发中,页面静态化是一种提高网站性能和用户体验的技术。它涉及到将原本动态生成的页面转换为静态HTML文件,减少对服务器的依赖,加快页面加载速度...

    Freemarker分页

    Freemarker分页是Web开发中的一个重要概念,它主要用于在大量数据展示时,将结果集分割成多个小块,每次只加载一部分数据,提高页面加载速度并提升用户体验。在这个例子中,我们看到的是如何在使用Struts2框架的基础...

    springboot整合FreeMarker模板,完成页面静态化处理

    springboot整合FreeMarker模板,完成页面静态化处理

    freemarker把jsp静态化简单应用

    通过以上步骤,你就可以在MyEclipse中使用FreeMarker实现JSP页面的静态化。记住,良好的分层设计和模板使用习惯能显著提高代码质量,使项目更加易于维护和扩展。继续深入学习FreeMarker的高级特性,你将能够更高效地...

    Spring,Spring Data Jpa,freemarker,bootstrap实现的分页源代码

    在本项目中,我们主要探讨了如何利用Spring框架、Spring Data JPA、FreeMarker模板引擎以及Bootstrap前端框架来实现一个高效且用户友好的分页功能。以下是对这些技术及其在分页实现中作用的详细解释。 **Spring框架...

    freemarker权威版 网站静态化

    Freemarker是一个强大的模板引擎,常用于Web应用中的视图层,实现动态内容与静态页面的分离。在网站静态化的过程中,Freemarker扮演着关键角色。通过将动态数据注入到预定义的模板中,它能够生成HTML或其他静态格式...

    Freemarker网站静态化的实现实例源码(eclipse)

    5. **静态化实现步骤**: - 数据准备:构建数据模型,这可以是数据库查询结果或者由Java服务提供的任何动态数据。 - 模板渲染:使用Freemarker API加载模板文件,结合数据模型生成HTML字符串。 - 文件写入:将...

    springmvc+mybatis通用分页

    本篇文章将详细讲解如何将它们整合,并实现一个通用的分页功能。 首先,SpringMVC作为Spring框架的一部分,主要用于处理Web请求,它提供了一个灵活的MVC模型,使开发者可以轻松地将业务逻辑与视图分离。在SpringMVC...

    Jsp页面静态化(freemarker)教程及源码

    前台页面的静态化就有利于SEO,所以这个问题摆在了我的面前,在网上一搜,关于这方面的资料不是很多,又很杂,关于这方面的知识,越来或多的程序员将会碰到,原来项目中这部分静态化的功能主要由我来做的,现在我将...

    freemarker_struts2分页

    本篇文章将深入探讨如何在Struts2框架下结合FreeMarker实现分页功能,帮助开发者更高效地处理大数据量的展示问题。 首先,了解分页的基本原理。分页是用来解决一次性加载大量数据导致页面加载过慢或内存压力过大的...

    SSM+websocket+freemarker+mybatis分页插件+多数据源实现

    标题 "SSM+websocket+freemarker+mybatis分页插件+多数据源实现" 涉及到的是一个综合性的Java Web项目,其中包含了多个关键的技术组件。以下是这些技术组件的详细说明: 1. **Spring(SSM中的S)**:Spring是一个...

Global site tag (gtag.js) - Google Analytics