struts2学习

来源:互联网 发布:Windows资源无响应 编辑:程序博客网 时间:2024/04/29 14:30

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



0 0
原创粉丝点击