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

来源:互联网 发布:淘宝买到假酒怎么办 编辑:程序博客网 时间:2024/06/05 06:41

后台添加新闻(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 blocke.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}

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);//生成htmlConfiguration cfg=new Configuration(Configuration.VERSION_2_3_23);//过期的替代cfg.setDirectoryForTemplateLoading(new File("src/main/resources"));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";//在磁盘下生成htmlWriter 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 stubdoGet(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 blocke.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 stubdoGet(request, response);}}



原创粉丝点击