层层递进Struts1(一)之由Servlet引入Struts

    在说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(八)之总结》

    

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 25
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 25
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值