在传统的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;
}
}
<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>