在说Struts1之前,我们先来使用Servlet编写一个程序从而了解Struts产生原因和用途:一个简单的增删改查,我们来看一下使用Servlet是如何实现的,为了形象说明,我们从最基本的开始写,然后逐步递进。
第一版
这一版我们使用最常规的做法,增删改查每个功能都使用自己的Servlet,内容如下:
文件树
index.jsp
<form action="servlet/AddUserServlet" method="post">
姓名:<input type="text" name="username" /><br/>
<input type="submit" value="submit"/>
</form>
Servlet
为了方便说明此处的四个Servlet内容基本相同,此处以AddUserServlet和DelServlet为例:
AddUserServlet
package com.tgb.struts1.servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class AddUserServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String username=request.getParameter("username");
UserManager userManager=new UserManager();
userManager.add(username);
request.getRequestDispatcher("/add_success.jsp").forward(request, response);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
DelUserServlet
package com.tgb.struts1.servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class DelUserServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String username=request.getParameter("username");
UserManager userManager=new UserManager();
userManager.del(username);
request.getRequestDispatcher("/del_success.jsp").forward(request, response);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
UserManager
模仿逻辑处理层和数据处理层
package com.tgb.struts1.servlet;
import java.util.ArrayList;
import java.util.List;
public class UserManager {
public void add(String username){
System.out.println("userManager------->add,username="+username);
}
public void del(String username){
System.out.println("userManager------->del,username="+username);
}
public void modify(String username){
System.out.println("userManager------->modify,username="+username);
}
public List query(String username){
System.out.println("userManager------->query,username="+username);
List userList=new ArrayList();
userList .add("a");
userList.add("b");
return userList;
}
}
配置文件
<servlet>
<servlet-name>AddUserServlet</servlet-name>
<servlet-class>com.tgb.struts1.servlet.AddUserServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>AddUserServlet</servlet-name>
<url-pattern>/servlet/AddUserServlet</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>DelUserServlet</servlet-name>
<servlet-class>com.tgb.struts1.servlet.DelUserServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>DelUserServlet</servlet-name>
<url-pattern>/servlet/DelUserServlet</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>ModifyUserServlet</servlet-name>
<servlet-class>com.tgb.struts1.servlet.ModifyUserServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ModifyUserServlet</servlet-name>
<url-pattern>/servlet/ModifyUserServlet</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>QueryUserServlet</servlet-name>
<servlet-class>com.tgb.struts1.servlet.QueryUserServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>QueryUserServlet</servlet-name>
<url-pattern>/servlet/QueryUserServlet</url-pattern>
</servlet-mapping>
总结
使用这种Servlet方式实现,很容易发现,存在多个问题:
- 配置文件冗余
- Servlet文件冗余,随着功能的增多,Servlet文件越来越多,越难以整理分类
- 代码冗余,增删改查四个功能,需要有相当多的重复代码,难以维护
第二版
针对上面发现的问题我们继续修改上面的程序:针对第一版的主要的Servlet问题,然后使用截取url地址的方式,减少Servlet数量。
文件树
index.jsp
<form action="servlet/addUser.do" method="post">
姓名:<input type="text" name="username" /><br/>
<input type="submit" value="submit"/>
</form>
Servlet
package com.tgb.struts1.servlet;
import java.io.IOException;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.swing.text.html.ListView;
import org.apache.taglibs.standard.extra.spath.Path;
public class TestServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//get uri and path
String uri=request.getRequestURI();
String path=uri.substring(uri.indexOf("/",1),uri.indexOf("."));
//get username
String username=request.getParameter("username");
System.out.println(path);
UserManager userManager=new UserManager();
//forward to path with path
if ("/servlet/addUser".equals(path)) {
userManager.add(username);
request.getRequestDispatcher("/add_success.jsp").forward(request, response);
}else if ("/servlet/delUser".equals(path)) {
userManager.del(username);
request.getRequestDispatcher("/del_success.jsp").forward(request, response);
}else if ("/servlet/modifyUser".equals(path)) {
userManager.modify(username);
request.getRequestDispatcher("/modify_success.jsp").forward(request, response);
}else if ("/servlet/queryUser".equals(path)) {
List userList= userManager.query(username);
request.setAttribute("userList", userList);
request.getRequestDispatcher("/query_success.jsp").forward(request, response);
}else {
throw new RuntimeException("not found this order!");
}
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
UserManager
同第一版
配置文件
<servlet>
<servlet-name>TestServlet</servlet-name>
<servlet-class>com.tgb.struts1.servlet.TestServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>TestServlet</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
总结
第二版克服了Servlet文件过多、配置冗余和代码冗余的问题,但是这个版本的问题也很明显:TestServlet中代码重复,最大的一个问题就是:失去了灵活性,在TestServlet中,使用过多字符串,无法再灵活添加其它功能,已经被我们“写死”到代码中。第三版
这一版我们尝试对第二版进行精简,增加它的灵活性。
文件树
index.jsp
与第二版相同
Servlet
package com.tgb.struts1.servlet;
import java.io.IOException;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.swing.text.html.ListView;
import org.apache.taglibs.standard.extra.spath.Path;
public class TestServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//get uri
String uri=request.getRequestURI();
String path=uri.substring(uri.indexOf("/",1),uri.indexOf("."));
String username=request.getParameter("username");
System.out.println(path);
UserManager userManager=new UserManager();
String forward=null;
Action action=null;
if ("/servlet/addUser".equals(path)) {
action=new AddUserAction();
}else if ("/servlet/delUser".equals(path)) {
action=new DelUserAction();
}else if ("/servlet/modifyUser".equals(path)) {
action=new ModifyUserAction();
}else if ("/servlet/queryUser".equals(path)) {
action=new QueryUserAction();
}else {
throw new RuntimeException("not found this order!");
}
forward=action.execute(request, response);
request.getRequestDispatcher(forward).forward(request, response);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
Action
package com.tgb.struts1.servlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public interface Action {
public String execute(HttpServletRequest request,HttpServletResponse response);
}
AddUserAction
package com.tgb.struts1.servlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class AddUserAction implements Action {
public String execute(HttpServletRequest request,
HttpServletResponse response) {
String username=request.getParameter("username");
UserManager userManager=new UserManager();
userManager.add(username);
return "/add_success.jsp";
}
}
UserManager
与第一版相同
配置文件
与第二版相同总结
这一版使用接口和实现接口的类,在一定程度上精简了Servlet的代码重复问题,同时也在一定程度上解决了Servlet中写的代码“太死”的问题,但是在扩展性上还是有很大的问题。
总结
从上面的三个版本中,我们抽象一下,在控制页面跳转中,我们需要解决冗余和灵活问题,都需要做些什么?很明显根据第二版,我们知道在控制转向的方向问题上我们可以使用url截取;结合第三版,我们知道在精简页面转向类中,接口可以让代码更精简。
再结合以前所学,要使程序更灵活,当然还要把转向信息写到配置文件中。
我们再来抽象一下转向的过程:转向请求截取,转向请求分析比对,对请求的数据和逻辑处理,跳转到指定页
……好吧,这些基本上已经是Struts1框架的基本内容。
更多相关博客,请至《层层递进Struts1(八)之总结》。