实现一个简单的加法运算. 自己写的一个类struts的框架.便于更好的理解struts的实现原理.
第一步: 由于struts把所有的请求都交给了一个核心控制器, 所以我们也定义了一个核心控制器Controller
package org.servlet;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.action.Action;
import org.action.addAction;
public class Controller extends HttpServlet {
private static final long serialVersionUID = 1L;
Map<String, Action> map;
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
// 得到请求路径
String urlStr = req.getServletPath();
urlStr = urlStr.substring(urlStr.lastIndexOf("/")+1, urlStr.length() - 3);
System.out.println(urlStr);
// 得到具体的action
Action action = map.get(urlStr);
// 跳转
if (action != null) {
req.getRequestDispatcher(action.exec(req, resp)).forward(req, resp);
}
}
@Override
public void init() throws ServletException {
map = new HashMap<String, Action>();
map.put("add", new addAction());
}
}
第二步:接着我们在web.xml配置所有的请求都交给这个 Servlet处理.
<servlet>
<servlet-name>Controller.do</servlet-name>
<servlet-class>org.servlet.Controller</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Controller.do</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
第三步:定义一个action的接口用来描述我们的操作
package org.action;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public interface Action {
/**
* 接口
*
* @return
*/
public String exec(HttpServletRequest request, HttpServletResponse response);
}
第四步: 实现Action接口
package org.action;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.biz.testBiz;
import com.sun.corba.se.impl.orb.ParserTable.TestBadServerIdHandler;
public class addAction implements Action {
@Override
public String exec(HttpServletRequest request, HttpServletResponse response) {
testBiz test = new testBiz();
int num = test.addTest(Integer.parseInt(request.getParameter("num1")),
Integer.parseInt(request.getParameter("num2")));
request.setAttribute("num", num);
return "test.jsp";
}
}
第五步:在biz里面写具体的加法逻辑.
package org.biz;
public class testBiz {
public int addTest(int num1, int num2) {
return num1 + num2;
}
}
现在详细说明相关实现细节:
a.Controller这个核心控制里,我们首先获取了请求的url:
String urlStr = req.getServletPath();
urlStr = urlStr.substring(urlStr.lastIndexOf("/")+1, urlStr.length() - 3);
我们根据这个url当作了Map的key 去找相应的action, 如果找到我们就调用相应的方法实现加法.
在这里如果我们请求的url为:add.do那么Action action = map.get(urlStr); sction就不为空,我们在servlet的init()的方法里面定义的map 新建了一个addAction对象
public void init() throws ServletException {
map = new HashMap<String, Action>();
map.put("add", new addAction());
}
得到action后我们就可以调用相应的方法.