struts2学习

在传统的jsp+servlet+jdbc的java web开发模式中,往往将所有的逻辑控制代码放到servlet中实现。这就导致了servlet中的代码十分复杂,且在实际项目开发中会存在很多问题。struts2就是针对其中的一些问题而出现的。这些问题可以分为三类,称为硬代码、机械代码以及测试问题。下面将针对给出的代码进行分析。

import java.io.IOException;
import java.util.Random;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
/**
 */
public class NumberGuessServlet extends HttpServlet {
	public void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		String act = request.getParameter("act");
		String result = null;
		if("guess".equals(act)){
			result = guess(request, response);
		}else{
			result = newGame(request, response);
		}
		String forwardTo = "";
		if("success".equals(result)){
			forwardTo = "/javaweb/numguess2/success.jsp";
		}else{
			forwardTo = "/javaweb/numguess2/guess.jsp";
		}
		request.getRequestDispatcher(forwardTo).forward(request, response);
	}
	
	private String newGame(HttpServletRequest request, HttpServletResponse response){
		Random r = new Random();
		Integer i = r.nextInt(100)+1;
		request.getSession().setAttribute("number",i);
		request.getSession().setAttribute("guessTimes",0);
		Integer newGameCnt = (Integer)request.getSession().getServletContext().getAttribute("newGameCnt");
		if(newGameCnt == null)newGameCnt=0;
		request.getSession().getServletContext().setAttribute("newGameCnt",++newGameCnt);
		return "newGame";
	}
	private String guess(HttpServletRequest request, HttpServletResponse response){
		HttpSession session = request.getSession();
		int guess = Integer.parseInt(request.getParameter("guess"));
		Integer number = (Integer)session.getAttribute("number");
		int guessTimes = (Integer)session.getAttribute("guessTimes");
		session.setAttribute("guessTimes",++guessTimes);
		if(guess == number){
			request.setAttribute("msg","对了.");
			return "success";
		}else if(guess > number){
			request.setAttribute("msg","偏大了.");
		}else{
			request.setAttribute("msg","偏小了.");
		}
		return "failure";
	}
}
这个java培训上老师分析的例子,主要实现猜数字的功能。

(1)硬代码

        所谓硬代码就是一些写死在servlet中的配置信息,比如forwardTo = "/javaweb/numguess2/success.jsp";。如果要修改这些配置信息,我们就不得不修改servlet的源代码,十分的不方便。而struts2给出的解决方法就是将这些信息放在struts.xml配置文件中,根据返回值来控制所要跳转的页面。

(2)机械代码

       机械代码就是指一些重复操作,比如String act = request.getParameter("act");。基本上servlet都会对request传过来的参数进行复制操作,我们当然希望这类机械性的代码能够自动完成。这就是struts2的一个重要功能,对request、session等对象中的参数赋到方法中的变量里。

(3)测试问题

      由于servlet中用到的变量的值都是从tomcat的session、request中得到的,如果要对代码逻辑进行测试,我们必须启动server从前台页面输入参数,比较麻烦。由于struts2完成了将tomcat的session、request中的参数赋到servlet的变量中的工作,导致servlet的代码中并没有用到从session、request中取参数的方法,我们可以方便的直接写个主函数,然后自主给方法赋参数。


运用struts2后的代码如下

import java.util.Random;

import javax.servlet.http.HttpSession;

import org.apache.struts2.ServletActionContext;

/**
 * POJO
 * plain old java object
 *
 */
public class NumGuessAction {
	int guess;
	String msg;
	public String execute(){
		return newGame();
	}
	public String newGame(){
		Random r = new Random();
		Integer i = r.nextInt(100)+1;
		HttpSession session = ServletActionContext.getRequest().getSession();
		session.setAttribute("number",i);
		session.setAttribute("guessTimes",0);
		Integer newGameCnt = (Integer)session.getServletContext().getAttribute("newGameCnt");
		if(newGameCnt == null)newGameCnt=0;
		session.getServletContext().setAttribute("newGameCnt",++newGameCnt);
		return "newGame";
	}
	public String guess(){
		HttpSession session = ServletActionContext.getRequest().getSession();
		Integer number = (Integer)session.getAttribute("number");
		int guessTimes = (Integer)session.getAttribute("guessTimes");
		session.setAttribute("guessTimes",++guessTimes);
		if(guess == number){
			msg = "对了.";
			return "success";
		}else if(guess > number){
			msg = "偏大了.";
		}else{
			msg = "偏小了.";
		}
		return "failure";
	}
	public String testResult(){
		msg = "aaaaaaabbbbbbcccccc";
		return "abc";
	}
	public int getGuess() {
		return guess;
	}
	public void setGuess(int guess) {
		this.guess = guess;
	}
	public String getMsg() {
		return msg;
	}
	public void setMsg(String msg) {
		this.msg = msg;
	}
}


在struts.xml中根据上面的返回值进行页面的切换。

	<action name="numGuess" class="com.yuqiaotech.helloj2ee.webapp.NumGuessAction">
			<result name="success">/num_guess/success.jsp</result>
			<result name="failure">/num_guess/guess.jsp</result>
			<result name="newGame">/num_guess/guess.jsp</result>
			<result name="abc" type="simpleResult"/>
		</action>



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值