折腾两天了,初略的发现了问题出现的地方,原因还是没找到
主要就是userName没传递下去,userArray是传递下去了的。原因是什么呢。1、从user页面输入一个userName提交到MainServlet这里没问题,代码不贴了。2、MainServlet中的doGet()代码
response.setContentType("text/html;charset=GBK");
response.setCharacterEncoding("GBK");
PrintWriter out = response.getWriter();
request.setCharacterEncoding("GBK");
String usrName=request.getParameter("userName");
if(usrName==null||usrName.equals(" ")){
out.println("<h1 style='color:red' align='center'>请返回并输入有效的用户名</h1>");
}
else{
Vector vec=(Vector)getServletContext().getAttribute("userArray");
if (vec==null) {
vec=new Vector();

if(!vec.contains(usrName)){
vec.add(usrName);
//Servlet上下文初始化
HttpSession ses=request.getSession();
ses.setAttribute("userName", usrName);
getServletContext().setAttribute("userArray", vec);//是因为这个保证了userArray的正常传递了吗?
//Servlet上下文初始化结束
out.println("<html>");
out.println("<frameset rows='80%,*'>");
out.println("<frame src='top?name"+usrName+"'>");
out.println("<frame src='message?name"+usrName+"'>");
out.println("</frameset>");
out.println("</html>");
}
else {
out.println("<h1 style='color:red' align='center'>正在使用的用户ID</h1>");
}
}

out.close();
到这里userName是可以正常获取的,然后转到框架top和message中去。书上说的是,创建TopServlet和MessageServlet框架,并将用户名作为查询字符串传递
("<frame src='top?name"+usrName+"'>");
("<frame src='message?name"+usrName+"'>");就是说的这段了。可是usrName并没有传递过去。
3、top做的事情是继续分成两个框架,display和message其中doGet()部分代码
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException { response.setContentType("text/html;charset=GB2312");
response.setCharacterEncoding("GBK");
request.setCharacterEncoding("GBK");
PrintWriter out = response.getWriter();
out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">");
out.println("<HTML>");
out.println("  <HEAD><TITLE>TopServlet</TITLE></HEAD>");
out.println("<frameset cols='80%,*'>");
out.println("<frame src='display'>");
String usrName=request.getParameter("userName");//这里已经没有获取到userName的值了,问:应该怎么做?
out.println("<frame src='userlist?name="+usrName+"'>");
out.println(" </frameset>");
out.println("</HTML>");
out.flush();
out.close();
}
4、userlist能显示所有登陆者的名单,但是没有把当前用户设定为粗体,doGet()代码
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException { response.setContentType("text/html;charset=GB2312");
response.setCharacterEncoding("GBK");
PrintWriter out = response.getWriter();
out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">");
out.println("<HTML>");
out.println("<meta HTTP-EQUIV='REFRESH' content='3;userlist'>");
out.println("  <HEAD><TITLE>UserList</TITLE></HEAD>");
out.println("  <BODY bgcolor=\"#ffff00\">");
Vector usr=(Vector)getServletContext().getAttribute("userArray");//Vector数组正常获得了
request.setCharacterEncoding("GBK");
String UserName=request.getParameter("userName");//显然,是userName没有得到的原因
if (usr==null) {
throw new ServletException("Servlet中发生错误.");

for(int i=0;i<usr.size();i++)
{
if(String.valueOf(usr.get(i)).equals(UserName)){
out.println("<b>"+String.valueOf(usr.get(i))+"</b><br>");
}
else {
out.println(String.valueOf(usr.get(i))+"<br>");
}
}
out.println("  </BODY>");
out.println("</HTML>");
out.flush();
out.close();
}

解决方案 »

  1.   

    很少用servlet负责展现
    代码真多,up
      

  2.   

    初学这个,这是我的书中第3章的最后一个例子,我想弄明白再看下一章,好像书上的例子有些有问题的地方。也可能是我不懂不知道在frame中的src是怎么传值的,像这个
    <frame src='top?name"+usrName+"'>
    如果成功传了,我要取值的时候用什么getParameter?还是getQueryString?
    还有该取什么呢?name?还是userName?书上的top中取的userName没取到值message中用的name也没取到
    我都不知道哪个错了,或者都错了?
      

  3.   

    你不是设置了 >>>   ses.setAttribute("userName", usrName);   //把userName值设到session中了吗?你直接到Session中取不就行了吗??
      

  4.   

    userName被放到了session里
    ses.setAttribute("userName", usrName);但你却在reqeuest里取值,当然没有了
    String UserName=request.getParameter("userName");//显然,是userName没有得到的原因
    改:String UserName=ses.getAttribute("userName").toString();
    试试
      

  5.   

    通过url传值的方式是依靠url中?后面的内容获取的,内容的形式应该为:
    参数名1=值1&参数名2=值2...
    例子中
    out.println("<frame src='top?name"+usrName+"'>");
    name后面明显缺少等号,不符合标准;
    这行倒是对的
    out.println("<frame src='userlist?name="+usrName+"'>");而且取值方式也不应该是
    request.getParameter("userName")
    而应为request.getParameter("name"),因为name是参数名,你所要做得是通过参数取值。//Servlet上下文初始化
    HttpSession ses=request.getSession();
    ses.setAttribute("userName", usrName);这两步也不是通过上下文初始化,而是通过session方式保存usrName的值,以便你在其它地方可以取用。最后,建议LZ换本书吧,不要因此耽误啊附:getQueryString():是指请求字符串,即URL中?号后的所有字符组成的串 
        getParameter(String name):是返回参数key为name的值value