用foward,可以将response和request转向下一页。

解决方案 »

  1.   

    我用的是servlet,不是jsp,估计不能用forward吧。
    我发现如果客户端在阻塞等待回应,当doget()退出后,客户的阻塞也就结束了,
    是否可以说明servlet已关闭了客户的连接?
      

  2.   

    可以的:
      你在这个servlet的java文件里面定义一个全局变量
       HttpServletResponse res = null ;
      在doget()函数传入后,给它符值,这样在doget()函数之外不是也可用了吗?
      

  3.   

    servlet中用page.forward(".jsp")就可以返回到另外一个页面啊jsp中的用法和servlet不一样,你不必担心没法实现,肯定可以的
      

  4.   

    request.getRequestDispatcher(forwardPage).forward(request,response);
      

  5.   

    import java.io.*;  
    import java.sql.*;
    import javax.servlet.*;
    import javax.servlet.http.*;public class ReportAction extends HttpServlet {
      private static final String charset=System.getProperty("Errcharset")==null?"gb2312":System.getProperty("Errcharset");
      private static final boolean printDebug=false;
      private static final boolean printError=true;
      static final private String CONTENT_TYPE = "text/html; charset=GB2312";
      static final private String LOGINPAGE="../loginsev.jsp";
      static final private String DATABASE="OracleDB";
      static final private String ERRORPAGE="../error.jsp";//错误页
      static final private String SREPORTPAGE="/reports/sreport.jsp";//台帐
      static final private String YXRBPAGE="/reports/yxrb.jsp";//运行日报
      static final private String YXYBPAGE="/reports/yxyb.jsp";//运行月报
      static final private String SCRBPAGE="/reports/scrb.jsp";//生产日报
      static final private String SCZBYB="/reports/sczbyb.jsp";//生产指标月报
      static final private String LJSCYBPAGE="/reports/ljscyb.jsp";//累计生产月报
      private PoolManager p;
      private String errorMSG;  //Initialize global variables
      public void init() throws ServletException {
        p=PoolManager.getInstance();
      }
      //Process the HTTP Get request
      

  6.   

    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType(CONTENT_TYPE);
        request.setCharacterEncoding(charset);
        HttpSession session =request.getSession(false);
        if(session==null){//未登录,转到登录页面
         response.sendRedirect(LOGINPAGE);
         return ;
        }
        //设置日志文件路径
        String logFile=this.getServletConfig().getServletContext().getRealPath("/logs")+"\\reports.log";
        //设置xml文件路径
        String XMLdir=this.getServletConfig().getServletContext().getRealPath("/xmlreports");    String stdm=request.getParameter("stdm");
        if(stdm==null){//视图代码为空,转到错误页面
          toErrorPage("请给出需报表的名称!",response);
          return ;
        }
        if(stdm.startsWith("D13")){ //报表
          //生成报表,取得参数,需要生成报表的年月日
          String year=request.getParameter("year");
          String month=request.getParameter("month");
          String day=request.getParameter("day");
          String role=request.getParameter("role");
          print("date:"+year+"-"+month+"-"+day);
          String method="make";
          //是重新生成报表还是重新载入报表
          if("tongji".equals(role)){//统计人员
            method=request.getParameter("method");
          }else{//其他人员
            String xmlFilePath=XMLdir+"/"+year+"_"+month+"/";
            if(stdm.equals("D1301")){//运行日报
              xmlFilePath +="yxrb_"+day+".xml";
              File yxrb=new File(xmlFilePath);
              if(yxrb.exists()){
                method="reload";
              }
            }else if(stdm.equals("D1302")){//生产日报
              xmlFilePath +="scrb_"+day+".xml";
              File scrb=new File(xmlFilePath);
              if(scrb.exists()){
                method="reload";
              }
            }else if(stdm.equals("D1303")){//累计生产月报
              xmlFilePath +="ljscyb.xml";
              File ljscyb=new File(xmlFilePath);
              if(ljscyb.exists()){
                method="reload";
              }
            }else if(stdm.equals("D1304")){//生产指标月报
              xmlFilePath +="sczbyb.xml";
              File sczbyb=new File(xmlFilePath);
              if(sczbyb.exists()){
                method="reload";
              }
            }else if(stdm.equals("D1305")){//运行月报
              xmlFilePath +="yxyb.xml";
              File yxyb=new File(xmlFilePath);
              if(yxyb.exists()){
                method="reload";
              }
            }else{//错误
              error("No such report!");
              toErrorPage("未知的视图代码:"+stdm,response);
              return ;
            }
          }
          //执行操作的用户名
          User reporter=(User)session.getAttribute("use");
          print("method:"+method+"\nuser:"+reporter);
          ReportBean rpt=null;
          try {
            rpt = new ReportBean(DATABASE, stdm, year, month, day
                                 , reporter.getName(), method, XMLdir, logFile);
          }catch (SQLException ex) {
            error(ex.getMessage());
          }
          Report rptData=null;
          try{
            rptData=rpt.getReport();
          }catch(Exception e){
            errorMSG=e.toString();
            error(e.getMessage());
            //e.printStackTrace();
            toErrorPage(errorMSG,response);
            return ;
          }
          if(rptData!=null){
            request.setAttribute("reportData",rptData);
            if(stdm.equals("D1301")){
              this.getServletConfig().getServletContext().getRequestDispatcher(response.encodeURL(YXRBPAGE))
                  .forward(request, response);
            }else if(stdm.equals("D1302")){
              this.getServletConfig().getServletContext().getRequestDispatcher(response.encodeURL(SCRBPAGE))
                  .forward(request, response);
            }else if(stdm.equals("D1303")){
              this.getServletConfig().getServletContext().getRequestDispatcher(response.encodeURL(LJSCYBPAGE))
                  .forward(request, response);
            }else if(stdm.equals("D1304")){
              this.getServletConfig().getServletContext().getRequestDispatcher(response.encodeURL(SCZBYB))
                  .forward(request, response);
            }else if(stdm.equals("D1305")){
              this.getServletConfig().getServletContext().getRequestDispatcher(response.encodeURL(YXYBPAGE))
                  .forward(request, response);
            }else {
              error("No such report!");
              toErrorPage("未知的视图代码:"+stdm,response);
              return ;
            }
          }else{
            error("The Report is null");
            toErrorPage("报表对象为空!",response);
            return ;
          }
        }else if(stdm.startsWith("D14")){//台帐
          //取得生成台帐的参数
          String tmp_str=request.getParameter("startyear");
          String year=tmp_str==null?"":tmp_str.trim();
          tmp_str=request.getParameter("startmonth");
          String month=tmp_str==null?"":tmp_str.trim();
          tmp_str=request.getParameter("startday");
          String day=tmp_str==null?"":tmp_str.trim();
          if(StringUtil.nullOrBlank(year)||StringUtil.nullOrBlank(month)||StringUtil.nullOrBlank(day)){
            toErrorPage("请输入开始年月日!",response);
            return ;
          }
          String beginDate=year+"-"+month+"-"+day;
          tmp_str=request.getParameter("endyear");
          year=tmp_str==null?"":tmp_str.trim();
          tmp_str=request.getParameter("endmonth");
          month=tmp_str==null?"":tmp_str.trim();
          tmp_str=request.getParameter("endday");
          day=tmp_str==null?"":tmp_str.trim();
          if(StringUtil.nullOrBlank(year)||StringUtil.nullOrBlank(month)||StringUtil.nullOrBlank(day)){
            toErrorPage("请输入结束年月日!",response);
            return ;
          }
          String endDate=year+"-"+month+"-"+day;
          String lj=(String)request.getParameter("ljf");
          boolean ljf=(lj==null)?false:lj.trim().equals("1");
          String sjsx=request.getParameter("sjsx").trim();
          String bzdm=request.getParameter("bzdm").trim();
          //判断时间属性
          if(sjsx.equals("T")){
            sjsx="RYT";
          }else if(sjsx.equals("Y")){
            sjsx="RYY";
          }else{
            toErrorPage("请选择输出日指标还是月指标!",response);
            return ;
          }      //开始生成台帐
          SReport srpt=new SReport(stdm,DATABASE,beginDate,endDate,sjsx,bzdm,ljf,logFile);
          String title=srpt.getTitle();
          String[][] result = null;
          String[] guideLineArray=null;
          String[] dateArray=null;
          try {
            result=srpt.getResult() ;
            guideLineArray=srpt.getGuideLineArray();
            dateArray=srpt.getDateArray();
          }catch (Exception e) {
            errorMSG=e.getMessage();
            error(e.getMessage());
            e.printStackTrace();
            toErrorPage(errorMSG,response);
            return ;
          }      request.setAttribute("Title",title);
          request.setAttribute("Columns",guideLineArray);
          request.setAttribute("Rows",dateArray);
          request.setAttribute("Data",result);
          request.setAttribute("ljf",new Boolean(ljf));
          this.getServletConfig().getServletContext().getRequestDispatcher(response.encodeURL(SREPORTPAGE))
              .forward(request, response);
        }else{//不能生成此类报表
          error("Can't Make this type of report");
          toErrorPage("不能生成此类报表:"+stdm,response);
          return ;
        }
      }
      //Process the HTTP Post request
      public  void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request,response);
      }
      //Clean up resources
      public void destroy() {
        p.release();
      }
      private void print(String s){
        if(printDebug)System.out.println(s);
      }
      private void error(String s){
        if(printError)System.err.println(s);
      }
      private void toErrorPage(String s,HttpServletResponse response) throws IOException{
        response.sendRedirect(ERRORPAGE+"?errMsg="+new String(s.getBytes(),charset));
      }
    }
      

  7.   

    不知上述例子对你是否有帮助,我不是经常在CSDN上,你可以邮件和我联系
    [email protected]
      

  8.   

    我之所以要保留response变量,是为了在恰当的时候使用。关于使用的
    环境,可参考
    http://expert.csdn.net/Expert/topic/2094/2094015.xml?temp=.4979517因为在doget()中我并不能得到客户要的结果。此结果在selector侦听到
    服务器的socket发来数据,并将之取出来才有。我想在取出结果后再调用
    response变量向客户发回数据。如果用forward转向一个jsp或其他资源,也
    无法立即得到结果数据。刚接触java就搞这么复杂的问题,苦啊。
      

  9.   

    request.getRequestDispatcher("/test.jsp").forward(request,response);这个就是jsp的foward到servlet中的对应用法
      

  10.   

    webswim(网中漫步)一语中的啊。我要做的其实是个代理。所有客户(J2ME)都发送请求到此代理 servlet,
    在doget()中向server发出客户的请求,然后doget()就结束,结束前我想把
    response变量保存下来。在侦听线程中,使用selector异步侦听与server
    连接的各socket的状态,在有数据来时,读取。然后利用保存的response变量
    把结果发回对应的客户,我理解response变量可以标识客户。客户阻塞等待结果返回。但测试后发现,客户并不能收到结果。并且在
    doget()结束时,客户的阻塞也就结束了,我看阻塞结束的条件是read到
    了流结束的标志,看来doget()退出时会向客户发出流结束的标志。并且
    servlet可能也关闭了此连接。所以我保留response变量是不是就没有任何意义
    了呀?如果真如此,我只能不结束doget(),在doget()中等待selector收到结果,
    置标志位后我再去取结果,发回客户,再结束。如此麻烦?
      

  11.   

    我觉得doget()发出结束流标志的话,客户端就会端开和你的连接,然后的问题是Servlet如何再发信息给客户?如果不结束流,客户就得等待!J2ME是做手机程序的吧? 对这种情况也许有方法连接具体的手机,就象发短信? 或者手机端的浏览器可以侦听?
      

  12.   

    感谢webswim(网中漫步)。
    正象你说的,doget()结束后,客户端就会断开连接,Servlet不能再与
    客户有联系。如果不结束流,客户就得等待。如今我只能用我最后提到的方法,在doget()中等待服务器结果返回后,
    再发向客户,再结束doget()。如果再没有其他讨论意见,本帖将在下周一结贴。感谢诸位。