request.getRequestDispatcher()是请求转发,前后页面共享一个request ; 
response.sendRedirect()是重新定向,前后页面不是一个request。

解决方案 »

  1.   

    request
    session
    看看他们的有效期
      

  2.   

    LoginServlet:package com.test.servlet;import java.io.IOException;import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;public class LoginServlet extends HttpServlet { private static final long serialVersionUID = 1L;
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp)
    throws ServletException, IOException {
    this.process(req, resp);
    }


    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp)
    throws ServletException, IOException {
    this.process(req, resp);
    }

    protected void process(HttpServletRequest req, HttpServletResponse resp)
    throws ServletException, IOException {
    req.setCharacterEncoding("UTF-8");
    resp.setCharacterEncoding("UTF-8");
    String username = req.getParameter("username");
    String password = req.getParameter("password");
    //假设username=admin password="123"的时候才可以登录
    if(username!=null && username.equals("admin") && password!=null && password.equals("123")){
    req.getSession().setAttribute("username", username);//把username放到session里面
    req.getRequestDispatcher("/welcome.jsp").forward(req, resp);
    }else{
    req.getRequestDispatcher("/error.jsp").include(req, resp);
    }
    }
    }
    index.jsp<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
    <!DOCTYPE html>
    <html>
      <head>
      </head>
      <body>
       <form action="login" method="post">
       username:<input type="text" name="username"><br/>
       password:<input type="password" name="password"><br/>
       <input type="submit" value="commit">
       </form>
      </body>
    </html>
    welcome.jsp:<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    <html>
      <head>
        <title>My JSP 'welcome.jsp' starting page</title>
    <meta http-equiv="pragma" content="no-cache">
    <meta http-equiv="cache-control" content="no-cache">
    <meta http-equiv="expires" content="0">    
    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
    <meta http-equiv="description" content="This is my page">
      </head>
      <body>
    欢迎您:${username}
      </body>
    </html>error.jsp:<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    <html>
      <head>
        <title>My JSP 'error.jsp' starting page</title>
    <meta http-equiv="pragma" content="no-cache">
    <meta http-equiv="cache-control" content="no-cache">
    <meta http-equiv="expires" content="0">    
    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
    <meta http-equiv="description" content="This is my page">
      </head>
      <body>
    登录失败,<a href="index.jsp">点击回到登录页面</a>
      </body>
    </html>
    web.xml:<?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
    version="3.0">
    <display-name></display-name> <servlet>
    <servlet-name>login</servlet-name>
    <servlet-class>com.test.servlet.LoginServlet</servlet-class>
    </servlet>
    <servlet-mapping>
    <servlet-name>login</servlet-name>
    <url-pattern>/login</url-pattern>
    </servlet-mapping>

    <!-- 多个servlet的话,就在下面继续写 -->
    <!-- 
    <servlet>
    <servlet-name>asd</servlet-name>
    <servlet-class>asdasd</servlet-class>
    </servlet>
    <servlet-mapping>
    <servlet-name>asd</servlet-name>
    <url-pattern>/asdasd</url-pattern>
    </servlet-mapping>
    -->
     
    <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
    </welcome-file-list>
    </web-app>
      

  3.   

    至于你不明白的几个地方,自己baidu  google吧
      

  4.   

    servlet是javaweb中最最基础的东西,下面给你解答一下你的问题。
    1.servlet的数据始终是前台传过来的,你的LogServlet可以用request.getParamter("username")取到。而页面上的数据有可能是从servlet传过去的,也有可能是从作用域中读取的(比如:request、session等)。关于怎么从servlet传递数据到页面,就牵扯到你的第二个问题。forward()方法和sendRedrect()方法。
    2.forward()方法和sendRedrect()方法这两个是比较传统的一个问题,不管是学校的考试,还是工作中的面试笔试都经常会问到。你一搜一大堆。简单的给你解释一下,sendRedrect()是客户端跳转,是HttpResponse的方法,不能传递数据,就是让你当前的请求单纯的跳到一个URL。而forward()是服务器端跳转,可以传递数据,它是HttpRequest的方法,也叫“请求转发”,顾名思义,就是在服务器内部,我交给另一个URL来处理,并且在作用域中的数据可以保存下来。现在解答你第一个问题,你LogServlet的username是前台传的,你错误页面的username是你通过请求转发发到错误页面的。明白了把。
    3.forward()方法和include()方法也很类似,功能都是请求转发,不过include()方法貌似用的很少,反正我基本没用过,作用类似于JSP的include标签。用在servlet里面的话就是你执行完include(),还会回到你之前的servlet,而forward()就不会再返回到原来的servlet执行后续代码。
    4.多个Servlet就挨个配置呗,一个servlet对应一个servlet-mapping,也可以用注解配置,JDK1.6之后支持注解配置servlet。
    有什么不明白的地方可以再提出来。
      

  5.   

    问题1、传值可用request、session
    问题2、request.getRequestDispatcher()是请求转发,可传值(参数)。response.sendRedirect()是重新定向,不可传值。
    问题3、forward方法是把请求的内容转发到另外的一个servlet.而include是把另一个servlet处理过后的内容拿过来.
    举例来说比如在servlet1打一句out.print("1111"),servlet2打上out.print("22222"),在servlet1中用forward命令会转到servlet2中,显示22222.
    而在servlet1中使用include方法会依然在servlet1的页面中,但是在1111后打出22222(百度)
    问题4、
    <servlet>
        <description>This is the description of my J2EE component</description>
        <display-name>This is the display name of my J2EE component</display-name>
        <servlet-name>你的servlet名字</servlet-name>
        <servlet-class>servlet所在位置(包名)</servlet-class>
      </servlet>
    <servlet-mapping>
        <servlet-name>你的servlet名字</servlet-name>
        <url-pattern>servlet访问路径</url-pattern>
      </servlet-mapping>
      

  6.   

    补充:多个servlet在同一包下可用通配符匹配的方式进行配置
    <servlet>
        <description>This is the description of my J2EE component</description>
        <display-name>This is the display name of my J2EE component</display-name>
        <servlet-name>你的servlet名字</servlet-name>
        <servlet-class>servlet所在位置(包名)</servlet-class>
      </servlet>
    <servlet-mapping>
        <servlet-name>你的servlet名字</servlet-name>
        <url-pattern>/×</url-pattern>
      </servlet-mapping>即使用"*"匹配任意  0个,1个或者多个字符。