急啊,高分请教!servlet中的doget()函数的传入变量HttpServletResponse,能否保存下来,在doget()结束后还能使用? 用foward,可以将response和request转向下一页。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 我用的是servlet,不是jsp,估计不能用forward吧。我发现如果客户端在阻塞等待回应,当doget()退出后,客户的阻塞也就结束了,是否可以说明servlet已关闭了客户的连接? 可以的: 你在这个servlet的java文件里面定义一个全局变量 HttpServletResponse res = null ; 在doget()函数传入后,给它符值,这样在doget()函数之外不是也可用了吗? servlet中用page.forward(".jsp")就可以返回到另外一个页面啊jsp中的用法和servlet不一样,你不必担心没法实现,肯定可以的 request.getRequestDispatcher(forwardPage).forward(request,response); 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 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)); }} 不知上述例子对你是否有帮助,我不是经常在CSDN上,你可以邮件和我联系[email protected] 我之所以要保留response变量,是为了在恰当的时候使用。关于使用的环境,可参考http://expert.csdn.net/Expert/topic/2094/2094015.xml?temp=.4979517因为在doget()中我并不能得到客户要的结果。此结果在selector侦听到服务器的socket发来数据,并将之取出来才有。我想在取出结果后再调用response变量向客户发回数据。如果用forward转向一个jsp或其他资源,也无法立即得到结果数据。刚接触java就搞这么复杂的问题,苦啊。 request.getRequestDispatcher("/test.jsp").forward(request,response);这个就是jsp的foward到servlet中的对应用法 webswim(网中漫步)一语中的啊。我要做的其实是个代理。所有客户(J2ME)都发送请求到此代理 servlet,在doget()中向server发出客户的请求,然后doget()就结束,结束前我想把response变量保存下来。在侦听线程中,使用selector异步侦听与server连接的各socket的状态,在有数据来时,读取。然后利用保存的response变量把结果发回对应的客户,我理解response变量可以标识客户。客户阻塞等待结果返回。但测试后发现,客户并不能收到结果。并且在doget()结束时,客户的阻塞也就结束了,我看阻塞结束的条件是read到了流结束的标志,看来doget()退出时会向客户发出流结束的标志。并且servlet可能也关闭了此连接。所以我保留response变量是不是就没有任何意义了呀?如果真如此,我只能不结束doget(),在doget()中等待selector收到结果,置标志位后我再去取结果,发回客户,再结束。如此麻烦? 我觉得doget()发出结束流标志的话,客户端就会端开和你的连接,然后的问题是Servlet如何再发信息给客户?如果不结束流,客户就得等待!J2ME是做手机程序的吧? 对这种情况也许有方法连接具体的手机,就象发短信? 或者手机端的浏览器可以侦听? 感谢webswim(网中漫步)。正象你说的,doget()结束后,客户端就会断开连接,Servlet不能再与客户有联系。如果不结束流,客户就得等待。如今我只能用我最后提到的方法,在doget()中等待服务器结果返回后,再发向客户,再结束doget()。如果再没有其他讨论意见,本帖将在下周一结贴。感谢诸位。 JSTL取出MAP中的值 父亲今年30岁,儿子今年6岁,问多少年后父亲的年龄是儿子年龄的2倍,求答案 坐了一天快要崩溃,高手们快进啊 javascript问题,郁闷中.在线等.. jsp页面间数据传递,请高手帮忙(我都发过两遍了,为什么我找不到我的贴子?) 基础知识过后,我是不是应该把tomcat换成weblogic了呢? 关于提交多项选择的问题!急!! CSDN左边选择论谈菜单的代码如何写? 启动tomcat4。0。4时,出现错误提示,帮忙看一下是怎么回事。 一个关于页面链接的问题! 多谢前段时间各位大虾的帮忙,现在小弟我还有一个小问题请教 jsp如何连数据库
我发现如果客户端在阻塞等待回应,当doget()退出后,客户的阻塞也就结束了,
是否可以说明servlet已关闭了客户的连接?
你在这个servlet的java文件里面定义一个全局变量
HttpServletResponse res = null ;
在doget()函数传入后,给它符值,这样在doget()函数之外不是也可用了吗?
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
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));
}
}
[email protected]
环境,可参考
http://expert.csdn.net/Expert/topic/2094/2094015.xml?temp=.4979517因为在doget()中我并不能得到客户要的结果。此结果在selector侦听到
服务器的socket发来数据,并将之取出来才有。我想在取出结果后再调用
response变量向客户发回数据。如果用forward转向一个jsp或其他资源,也
无法立即得到结果数据。刚接触java就搞这么复杂的问题,苦啊。
在doget()中向server发出客户的请求,然后doget()就结束,结束前我想把
response变量保存下来。在侦听线程中,使用selector异步侦听与server
连接的各socket的状态,在有数据来时,读取。然后利用保存的response变量
把结果发回对应的客户,我理解response变量可以标识客户。客户阻塞等待结果返回。但测试后发现,客户并不能收到结果。并且在
doget()结束时,客户的阻塞也就结束了,我看阻塞结束的条件是read到
了流结束的标志,看来doget()退出时会向客户发出流结束的标志。并且
servlet可能也关闭了此连接。所以我保留response变量是不是就没有任何意义
了呀?如果真如此,我只能不结束doget(),在doget()中等待selector收到结果,
置标志位后我再去取结果,发回客户,再结束。如此麻烦?
正象你说的,doget()结束后,客户端就会断开连接,Servlet不能再与
客户有联系。如果不结束流,客户就得等待。如今我只能用我最后提到的方法,在doget()中等待服务器结果返回后,
再发向客户,再结束doget()。如果再没有其他讨论意见,本帖将在下周一结贴。感谢诸位。