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