freemarker添加新闻和查询新闻的小案例

后台添加新闻(maven项目)

在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>easytop</groupId>
  <artifactId>news_manager</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <packaging>war</packaging>
  
  <dependencies>
  	<!-- freemarker的jar包 -->
  	<dependency>
	  <groupId>org.freemarker</groupId>
	  <artifactId>freemarker</artifactId>
	  <version>2.3.23</version>
	</dependency>
	
	<!-- mysql数据库的jar包 -->
	<dependency>
	  <groupId>mysql</groupId>
	  <artifactId>mysql-connector-java</artifactId>
	  <version>5.1.26</version>
	</dependency>
	
  </dependencies>
  
  <!-- 设值字符集和端口 -->
  <build>
  	<plugins>
  		<plugin>
  			<groupId>org.codehaus.mojo</groupId>
  			<artifactId>tomcat-maven-plugin</artifactId>
  			<version>1.1</version>
  			<configuration>
  				<uriEncoding>UTF-8</uriEncoding>
  				<port>8888</port>
  			</configuration>
  		</plugin>
  	</plugins>
  </build>
</project>

Utils工具类

package cn.et.model;

import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.util.Properties;

public class DbUtils {
	static Properties p=new Properties();
	static{
		//在bin目录去读jdbcmysql.properties文件
		InputStream is=DbUtils.class.getResourceAsStream("/jdbcoracle.properties");
		try {
			p.load(is);
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
	public static Connection getConnection() throws Exception{
		String url=p.getProperty("url"); //获取连接服务器的ip地址 端口 和数据库
		String driverClass=p.getProperty("driverClass");//告诉jdbc使用的是什么数据库
		String uname=p.getProperty("username");//使用哪个账号登录
		String paw=p.getProperty("password");//登录密码
		Class.forName(driverClass);//加载数据库的驱动
		Connection conn=DriverManager.getConnection(url,uname,paw);//登录
		return conn;
	}
	
	//往数据库中添加新闻
	public static int execute(String sql) throws Exception{
	    Connection conn=getConnection();
	    PreparedStatement pst = conn.prepareStatement(sql);
	    int i=pst.executeUpdate();
	    pst.close();
	    conn.close();
	    return i;
	}
}    
     
freemarker的模板

<h1><font color=blue>${title}</font><br/></h1>
  时政新闻 新华社${createtime}<br/>
  ${content}


执行往数据库插入数据

package cn.et.model;

import java.util.List;
import java.util.Map;

public class MyNews {
    /**
     * 
     * 插入新闻
     * @param titile
     * @param content
     * @param newsPath
     * @throws Exception
     */
    public void inserNews(String titile,String content,String newsPath,String createtime) throws Exception{
       String sql="insert into mynews(title,content,htmlpath,createtime) values('"+titile+"','"+content+"','"+newsPath+"','"+createtime+"')";
       DbUtils.execute(sql);
    }
}




servlet   往数据库插入新闻的同时   也要在磁盘生成html 来缓解数据库的压力

package cn.et.controller;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import cn.et.model.MyNews;
import freemarker.template.Configuration;
import freemarker.template.DefaultObjectWrapper;
import freemarker.template.Template;
import freemarker.template.TemplateException;

/**
 * Servlet implementation class NewsController
 */
public class NewsController extends HttpServlet {
	private static final long serialVersionUID = 1L;

    /**
     * Default constructor. 
     */
    public NewsController() {
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
    public static final String HTNL_DIR="E:\\html";
    MyNews my=new MyNews();
    SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
	public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.setContentType("text/html;charset=UTF-8");
		request.setCharacterEncoding("UTF-8");
	    String title=request.getParameter("title");
		String content=request.getParameter("content");
		//生成时间
		Date d=new Date();
		String date=sdf.format(d);
		//生成html
		Configuration cfg=new Configuration(Configuration.VERSION_2_3_23);//过期的替代
		cfg.setDirectoryForTemplateLoading(new File("src/main/resources"));//到该目录下寻找ftl模板
		cfg.setObjectWrapper(new DefaultObjectWrapper(Configuration.VERSION_2_3_23));//过期的替代
		Map root=new HashMap();
		root.put("title", title);
		root.put("content", content);
		root.put("createtime", date);
		//实例化模板对象
		Template temp=cfg.getTemplate("newsdetail.ftl");
		//保证生成html文件名的唯一性
		UUID uid=UUID.randomUUID();
		String saveFile=HTNL_DIR+"/"+uid+".html";
		//在磁盘下生成html
		Writer out=new OutputStreamWriter(new FileOutputStream(saveFile));
		try {
		    //按照模板下写入
            temp.process(root, out);
        } catch (TemplateException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }
		out.flush();
		out.close();
		
		//同时写入数据库
		try {
            my.inserNews(title, content, uid+".html", date);
            response.getWriter().println("添加成功");
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}

}
添加入口

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<form action="NewsController" method="post">
		标题:<input type="text" name="title"/><br/>
		内容:<textarea rows="20" cols="22" name="content"></textarea><br/>
		<input type="submit">
	</form>
	
</body>




前台查看新闻(maven项目)

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>easytop</groupId>
  <artifactId>news_front</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <packaging>war</packaging>
  
  <dependencies>
  	<!-- freemarker   jar包 -->
  	<dependency>
	  <groupId>org.freemarker</groupId>
	  <artifactId>freemarker</artifactId>
	  <version>2.3.23</version>
	</dependency>
	
	<!-- mysql 数据库的jar包 -->
	<dependency>
	  <groupId>mysql</groupId>
	  <artifactId>mysql-connector-java</artifactId>
	  <version>5.1.26</version>
	</dependency>
	
	
	<!-- io流的 jar包   有非常简单的方法使用 -->
	<dependency>
	  <groupId>org.apache.commons</groupId>
	  <artifactId>commons-io</artifactId>
	  <version>1.3.2</version>
	</dependency>
  </dependencies>
  
  <!-- 设值字符集 -->
  <build>
  	<plugins>
  		<plugin>
  			<groupId>org.codehaus.mojo</groupId>
  			<artifactId>tomcat-maven-plugin</artifactId>
  			<version>1.1</version>
  			<configuration>
  				<uriEncoding>UTF-8</uriEncoding>
  			</configuration>
  		</plugin>
  	</plugins>
  
  </build>
  
</project>

Utils工具类

package cn.et.model;

import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Properties;

public class DbUtils {
	static Properties p=new Properties();
	static{
		//在bin目录去读jdbcmysql.properties文件
		InputStream is=DbUtils.class.getResourceAsStream("/jdbcoracle.properties");
		try {
			p.load(is);
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
	public static Connection getConnection() throws Exception{
		String url=p.getProperty("url"); //获取连接服务器的ip地址 端口 和数据库
		String driverClass=p.getProperty("driverClass");//告诉jdbc使用的是什么数据库
		String uname=p.getProperty("username");//使用哪个账号登录
		String paw=p.getProperty("password");//登录密码
		Class.forName(driverClass);//加载该类
		Connection conn=DriverManager.getConnection(url,uname,paw);//登录
		return conn;
	}
	
	
	//从数据库中读取内容
	public static List<Map> query(String sql) throws Exception{
	    Connection conn=getConnection();
	    PreparedStatement pst= conn.prepareStatement(sql);
	    ResultSet rs=pst.executeQuery();
	    // 获取包含有关 ResultSet 对象列信息的 ResultSetMetaData 对象
	    ResultSetMetaData rsmd=rs.getMetaData();
	   //获取列的总数
	    int columnCount=rsmd.getColumnCount();
	    System.out.println(columnCount);
	    List list=new ArrayList();
	    while(rs.next()){
	        Map map=new HashMap();
	        for(int i=1;i<=columnCount;i++){
	            //获取列名
	            String colName=rsmd.getColumnName(i);
	            System.out.println(colName);
	            //获取对应的值
	            String colValue=rs.getString(i);
	            System.out.println(colValue);
	            //以键值对的方式存入map集合中
	            map.put(colName, colValue);
	        }
	        list.add(map);
	    }
	    rs.close();
	    pst.close();
	    conn.close();
	    return list;
	}
}    
     






为了缓解数据库的压力   要定时的从数据库查询数据

写一个定时器

package cn.et.main;

import java.util.Timer;

public class GenernateIndex{
    public static void main(String[] args) {
        Timer timer=new Timer();
        //启动刷新(去数据库读取内容) 每隔10分钟刷新一次
        timer.schedule(new MyTimerTask(), 0,100000);
    }
}
定时器启动读取数据的内容  并按freemarker模板生成一个html文件

freemarker模板

<#list newList as news>
<a href="DetailNewsServlet?path=${news.htmlpath}">${news.title}</a><br/>
</#list>


package cn.et.main;

import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.TimerTask;

import cn.et.model.MyNews;
import freemarker.template.Configuration;
import freemarker.template.DefaultObjectWrapper;
import freemarker.template.Template;

public class MyTimerTask extends TimerTask {
    MyNews my=new MyNews();
    @Override
    public void run() {
        try {
            Configuration cfg=new Configuration(Configuration.VERSION_2_3_23);
            cfg.setDirectoryForTemplateLoading(new File("src/main/resources"));
            cfg.setObjectWrapper(new DefaultObjectWrapper(Configuration.VERSION_2_3_23));
            List<Map> list=my.queryNews();
            Map root=new HashMap();
            root.put("newList", list);
            //按照index.ftl模板生成html
            Template temp=cfg.getTemplate("index.ftl");
            String saveFile="src/main/webapp/index.html";
            Writer out=new OutputStreamWriter(new FileOutputStream(saveFile));
            temp.process(root, out);
            out.flush();
            out.close();
        }catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

}
定时器读取数据库的内容生成一个如下的html文件 (点击返回相应的内容

<a href="DetailNewsServlet?path=d91dbaf9-a7bd-4303-8e27-7ad965655ac8.html">dfdfdsf</a><br/>
<a href="DetailNewsServlet?path=65e3bc1f-c0bd-498b-9735-e90beaa4ed36.html">的规定发给过</a><br/>

servlet   在磁盘读取相应的html并返回给浏览器

package cn.et.main;

import java.io.File;
import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.io.FileUtils;

/**
 * Servlet implementation class DetailNewsServlet
 */
public class DetailNewsServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public DetailNewsServlet() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
    public static final String HTML_DIR="E:\\html\\";
	public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		String path=request.getParameter("path");
		String abs=HTML_DIR+path;
		//去磁盘读取相应的html文件  在pom.xml引入的io jar包起作用了
		byte[] bt=FileUtils.readFileToByteArray(new File(abs));
		//返回给浏览器
		response.getOutputStream().write(bt);
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}

}



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值