forum框架无疑是创建论坛最快捷最简便的方法,但是我在开发的需求中,却需要在另外的后台管理页面进行论坛社区创建,所以我总结如下:
对于我们的论坛来说,版面是已经存在的,而我需要在每个版面下面任意的创建版区,考虑到日后版面的增加以及代码的重用性,我写了个名为creat-forum.properties的配置文件,内容为:
forum-id-3=3
forum-id-4=4
forum-id-5=5
既表示版面所对应的id.另外需要把创建论坛的返回结果以xml的形式返回.对此,我编写了抽象类,AbstractServlet.class
package com.ouou.servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.*;
import javax.xml.parsers.*;
import javax.xml.transform.*;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
public abstract class AbstractServlet extends HttpServlet
{
private static final long serialVersionUID = 0x2a5b6a49b3d6997L;
public AbstractServlet()
{
}
public void init()
throws ServletException
{
super.init();
}
public void service(HttpServletRequest httpservletrequest, HttpServletResponse httpservletresponse)
throws ServletException, IOException {
}
public Document createDocument()
{
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = null;
try
{
builder = factory.newDocumentBuilder();
}
catch(ParserConfigurationException e)
{
e.printStackTrace();
}
return builder.newDocument();
}
public void showResult(HttpServletResponse response, String result)
{
Document doc = createDocument();
Element element = doc.createElement("Result");
org.w3c.dom.Text text = doc.createTextNode(result);
element.appendChild(text);
doc.appendChild(element);
showXML(response, doc);
}
public void showResult(HttpServletResponse response, String result, String reason)
{
Document doc = createDocument();
Element rootnode = doc.createElement("return");
doc.appendChild(rootnode);
Element element = doc.createElement("Result");
org.w3c.dom.Text text = doc.createTextNode(result);
element.appendChild(text);
rootnode.appendChild(element);
element = doc.createElement("Reason");
text = doc.createTextNode(reason);
element.appendChild(text);
rootnode.appendChild(element);
showXML(response, doc);
}
protected void showXML(HttpServletResponse response, Document doc)
{
try
{
response.setHeader("Cache-Control", "no-cache");
response.setHeader("Cache-Control", "no-store");
response.setDateHeader("Expires", 0L);
response.setHeader("Pragma", "no-cache");
Transformer transformer = TransformerFactory.newInstance().newTransformer();
transformer.transform(new DOMSource(doc), new StreamResult(response.getOutputStream()));
}
catch(TransformerException e)
{
e.printStackTrace();
}
catch(IOException e)
{
e.printStackTrace();
}
}
}
具体的代码实现如下:
package com.ouou.servlet;
import java.io.IOException;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.jivesoftware.forum.Forum;
import com.jivesoftware.forum.ForumCategoryNotFoundException;
import com.jivesoftware.forum.database.DbForumFactory;
import com.jivesoftware.forum.ForumCategory;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import java.util.*;
public class CreateForumServlet extends AbstractServlet {
private static final long serialVersionUID = 1L;
private static final Log logger = LogFactory.getLog(CreateForumServlet.class);
private static final String CONTENT_TYPE = "text/xml;charset=utf-8";
private static final String PREFIX_STR = "Def_Forum_Cat_";
private Properties prop;
public void init(ServletConfig config) throws ServletException{
prop = new Properties();
try{
java.io.InputStream is = Thread.currentThread().getContextClassLoader().getResourceAsStream("creat- forum.properties");
prop.load(is);
}catch(IOException e){
logger.error(e);
e.printStackTrace();
}
}
public void service(HttpServletRequest request,HttpServletResponse reponse)throws IOException,ServletException
{
reponse.setContentType(CONTENT_TYPE);
ForumCategory forumCategory=null;
String returnVal = "0";
String returnStr = "fail";
long typevalue = 0l;
String typename = request.getParameter("typename");
try{
if(typename != null){
typevalue=Long.parseLong(prop.getProperty(PREFIX_STR+typename));
}
String forumname=request.getParameter("forumname");
String forumdescription=request.getParameter("forumdescription");
if(forumname == null || forumname.trim().equals("")){
throw new Exception("The forumname must't be empty");
}
if(forumdescription == null){
forumdescription = "";
}
//得到DbDorumFactory的一个实例对象dbforumFactory
DbForumFactory dbforumFactory =DbForumFactory.getInstance();
try{
//得到此分类的对象,其中此分类id为根据配置文件得到的值
forumCategory=dbforumFactory.getForumCategory(typevalue);
}
catch(ForumCategoryNotFoundException e)
{
throw new Exception("The category of the forum is not exits");
}
//判断论坛是否已经在此分类下存在
if(!(isCreatForum(forumname,forumCategory))){
Forum newForum=dbforumFactory.createForum(forumname,forumdescription,forumCategory);
returnVal = "1";
returnStr = "success";
}else{
returnStr = "The forum is aready exits!";
}//此论坛已经存在,创建失败
}catch(Exception e){
e.printStackTrace();
logger.error(e);
returnStr = e.getMessage();
}
showResult(reponse,returnVal,returnStr);
}
//判断论坛是否已经在此分类下存在
public static boolean isCreatForum(String name, ForumCategory forumCategory){
Iterator iterator=forumCategory.getForums();
while(iterator.hasNext()){
Forum forum=(Forum)iterator.next();
if(forum.getName().equals(name))
return true;
}
return false;
}
}
最后,把配置文件放到classes目录下面,并在web-inf下面配置CreateForumServlet,既可实现所要求的功能.
当然,这也是我不成熟的代码,没有考虑在版面不存在的情况下,创建版面的功能,在此,希望得到更多朋友的指导.