实现自己的Struts框架
- 使用的技术是servlet/jsp
首先我们自己写一个Action接口
package com.airycode.action;
import java.util.HashMap;
public interface Action {
public HashMap doAction(HashMap infoIn);
}
package com.airycode.action;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.UnsupportedEncodingException;
import java.util.Enumeration;
import java.util.HashMap;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class GdServlet extends HttpServlet {
public GdServlet() {
super();
}
public void destroy() {
super.destroy(); // Just puts "destroy" string in log
}
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
this.doPost(request, response);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
this.do_Dispatcher(request, response);
}
public void init() throws ServletException {
}
public void do_Dispatcher(HttpServletRequest request, HttpServletResponse response){
try {
//获取页面传来的值
String forwardJsp = request.getParameter("forwardJsp");
String logicName = request.getParameter("logicName");
//定义系统变量名
String systemName = "";
//获取访问的路径
String ss = request.getServletPath();
systemName = ss.split("/")[1];
//进行页面值的转换
HashMap infoIn = getRequestToMap(request);
//调用业务逻辑
Action action = (Action) Class.forName(this.getActionName(systemName, logicName)).newInstance();
HashMap infoOut = action.doAction(infoIn);
//将处理的结果返回给页面
request.setAttribute("infoOut", infoOut);
RequestDispatcher rd = request.getRequestDispatcher("/"+systemName+"/jsp/"+forwardJsp+".jsp");
rd.forward(request, response);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
private HashMap getRequestToMap(HttpServletRequest request) throws Exception {
request.setCharacterEncoding("GBK");
HashMap infoIn = new HashMap();
for (Enumeration e = request.getAttributeNames();e.hasMoreElements();) {
//获取页面中所有的元素的名字
String strName = (String)e.nextElement();
String[]values = request.getParameterValues(strName);
//根据名称获取对应的值
if (values == null ) {//假设没有值
infoIn.put(strName, "");
} else if (values.length == 1) {
infoIn.put(strName, values[0]);
} else {//假设有多个值
infoIn.put(strName, values);
}
}
return infoIn;
}
//获取指定的逻辑名
public String getActionName(String systemName,String actionName){
return "com."+systemName+".action."+actionName;
}
}
上述就是一个简陋的架子
下面我们写我们的测试这个架子能不能使用,我们拿我们最熟悉的登陆来测验。步骤:
1.编写用户登陆的页面Login.jsp
2.用户提交登陆信息后,如果登陆成功,转向登陆成功的页面success.jsp,否则返回登陆的界面。
3.编写业务逻辑LoginAction.java
4.配置web.xml