其实控制器编写出来之后就很简单了。因为控制器其实没有具体的功能,只是将request中的数据提交给相应的模块进行处理。当然大型的项目可以有很多控制器,组成一个控制层,但是中央控制器只有一个。我这个框架比较简单,只有一个核心控制器。
import java.io.IOException;
import javax.servlet.*;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.xml.parsers.*;
import org.w3c.dom.*;
import java.lang.reflect.Field;
import java.io.*;
import beans.action.*;
import java.lang.reflect.*;
/**
*
* @author Semor
*
*/
public class Controller extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public Controller() {
super();
//
// TODO Auto-generated constructor stub
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doPost(request,response);
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
try{
String configfile=this.getInitParameter("config");
String req_uri=request.getRequestURI();
String ctxPath = request.getContextPath();
String uri = req_uri.substring(ctxPath.length()+1);
DocumentBuilderFactory Factory = DocumentBuilderFactory.newInstance();
DocumentBuilder Builder = Factory.newDocumentBuilder();
InputStream is=getClass().getResourceAsStream(configfile);
Document doc=Builder.parse(is);
doc.normalize();
Element action = doc.getElementById(uri);
if(action==null)
{
System.out.println("Action Not Found,Please Check Your Config File!");
response.setContentType("text/html");
response.setCharacterEncoding("utf-8");
PrintWriter pw=response.getWriter();
pw.print("Server Error!Please Visit Later");
}else{
Object obj=setProperty(action.getAttribute("formbean"),request);
request.setAttribute("formbean", obj);
Class actionbean=Class.forName(action.getAttribute("class"));
Action ActionToExe=(Action)actionbean.newInstance();
if(ActionToExe.execute(request,response))
{
response.sendRedirect(action.getAttribute("forward"));
}else{
RequestDispatcher dispatcher = request.getRequestDispatcher(action.getAttribute("errorpage"));
dispatcher.forward(request,response);
}
}
}catch(Exception e)
{
e.printStackTrace();
}
}
public Object setProperty(String ClassPath,HttpServletRequest req)
{
try{
Class ClassName=Class.forName(ClassPath);
Object ClassInstance=ClassName.newInstance();
Method[] MethToExe=ClassName.getDeclaredMethods();
for(int i=0;i<MethToExe.length;i++)
{
String MethName=MethToExe[i].getName();
if(MethName.substring(0, 3).equals("set"))
{
String Parameter=req.getParameter(MethName.substring(3));
if(Parameter==null||Parameter.trim().equals(""))
{
continue;
}else{
Object arglist[] = new Object[1];
arglist[0] = new String(Parameter);
MethToExe[i].invoke(ClassInstance, arglist);
}
}
}
return ClassInstance;
}catch(Exception e)
{
e.printStackTrace();
}
return null;
}
}
代码比较简单,稍作解释:
1、doGet方法并没有具体的操作代码,而是提交给doPost来处理;
2、setProperty方法将request提交过来的数据封装到一个bean中,方法是调用的bean中的set函数,这种方式可能并不一定好,但是我现在没有找到更好的方式;
3、主函数首先从初始参数中得到配置文件的地址,然后读取配置文件,从配置文件中得到符合当前请求的action,然后将formbean存放到request范围内,提交给处理bean;
4、其中最后跳转的方法用了两个,一个是forword,另外一个是sendRedirect,这是因为forword并没有重新生成request对象,这样的话可以从request中读出错误信息,sendRedirect的话request将不再是从前的那个request,相当于重新发送了请求,如果request中保存了什么信息,这里也将不再存在。
下面会贴出配置文件的代码。
能不能发布Java 访问修饰符和static、final等关键字的配合实用的文章。
@姜少雷 什么意思?没听明白