.JSP和servlet连接到.java类

.JSP和servlet连接到.java类,java,jsp,servlets,Java,Jsp,Servlets,我无法运行我的程序。它应该从JSP页面获取信息到servlet,以便通过java类中的方法进行验证。然后,一旦验证,servlet确定是将消息发送到上一个JSP页面还是发送到成功的JSP页面。当我运行该程序时,它会将我带到RegisterUser.jsp页面。我输入信息,然后点击提交。它把我拖到一个404找不到的页面。该链接说它正在尝试将我指向CreateUser.java servlet。它不应该那样做。任何帮助都将不胜感激,无论是我可以找到信息的链接还是一些实际的解决方案帮助。多谢各位 Cr

我无法运行我的程序。它应该从JSP页面获取信息到servlet,以便通过java类中的方法进行验证。然后,一旦验证,servlet确定是将消息发送到上一个JSP页面还是发送到成功的JSP页面。当我运行该程序时,它会将我带到RegisterUser.jsp页面。我输入信息,然后点击提交。它把我拖到一个404找不到的页面。该链接说它正在尝试将我指向CreateUser.java servlet。它不应该那样做。任何帮助都将不胜感激,无论是我可以找到信息的链接还是一些实际的解决方案帮助。多谢各位

  • CreateUser.java SERVLET:

    @WebServlet(name = "createUser", urlPatterns = {"/createUser"})
     public class CreateUser extends HttpServlet {
    
    /**
     * Processes requests for both HTTP <code>GET</code> and <code>POST</code>
     * methods.
     *
     * @param req
     * @param resp
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    
         protected void processRequest(HttpServletRequest req, HttpServletResponse resp)   throws ServletException, IOException {
        System.out.println("in process login.java");
        ServletContext context = getServletContext();
    
        // Extract password and id from login.jsp form
    
        String userName = req.getParameter("USERNAME");
        String password = req.getParameter("PASSWORD");
        String answerOne = req.getParameter("ANSWERONE");
        String answerTwo = req.getParameter("ANSWERTWO");
        String answerThree = req.getParameter("ANSWERTHREE");
    
        Boolean duplicateUser = User.verifyUserExists(userName);
    
        HttpSession session = req.getSession();
        if (duplicateUser) {
            req.setAttribute("MESSAGE", "UserName is in use. Try again");
            context.getRequestDispatcher("/RegisterUser.jsp").forward(req, resp);
        }
        else{
            User user = new User(userName, password, answerOne, answerTwo, answerThree);
            user.addUser(user);
            req.getRequestDispatcher("RegistrationSuccessful.jsp").forward(req, resp);
        }
    
    }
    
    }

  • RegisterUser.jsp

  • 
    新用户注册
    所需信息
    用户名:
    密码:
    最喜欢的度假地点:
    母亲的娘家姓:
    第一只宠物的名字:
    ${MESSAGE}

  • User.java类
  • 公共类用户{

    private String userName;
    private String password;
        private String answerOne;
        private String answerTwo;
        private String answerThree;
        private static File file = new File("C:\\Users.txt");
    
        @SuppressWarnings("OverridableMethodCallInConstructor")
        public User(String un, String pw, String a1, String a2, String a3) {
            setUserName(un);
            setPassword(pw);
            setAnswerOne(a1);
            setAnswerTwo(a2);
            setAnswerThree(a3);
    
        }
    
        public void addUser(User user) throws IOException {
            FileWriter fw = new FileWriter(getFile());
            try (BufferedWriter bfw = new BufferedWriter(fw)) {
                bfw.write(user.userName);
                bfw.write(user.password);
                bfw.write(user.answerOne);
                bfw.write(user.answerTwo);
                bfw.write(user.answerThree);
                bfw.newLine();
            }
    
        }
    
        public static boolean verifyUserExists(String userName) throws FileNotFoundException {
            Scanner scannedFile = new Scanner(getFile());
            while (scannedFile.hasNext()) {
                String search = scannedFile.next();
                return search.equals(userName);
            }
            return false;
        }
    
        public static Boolean verifyPassword(String userName, String password) throws FileNotFoundException {
            Scanner scannedFile = new Scanner(getFile());
            while (scannedFile.hasNext()) {
                String search = scannedFile.next();
                if (search.equals(userName)) {
                    return scannedFile.nextLine().equals(getMD5(password));
                }
            }
            return false;
        }
    
        public static String getMD5(String input) {
            try {
                MessageDigest md = MessageDigest.getInstance("MD5");
                byte[] messageDigest = md.digest(input.getBytes());
                BigInteger number = new BigInteger(1, messageDigest);
                String hashtext = number.toString(16);
                // Now we need to zero pad it if you actually want the full 32 chars.
                while (hashtext.length() < 32) {
                    hashtext = "0" + hashtext;
                }
                return hashtext;
            } catch (NoSuchAlgorithmException e) {
                throw new RuntimeException(e);
            }
        }
    
        public static File getFile() {
            return file;
        }
    
    私有字符串用户名;
    私有字符串密码;
    私人字符串应答器;
    私人字符串应答器2;
    私人字符串应答器3;
    私有静态文件=新文件(“C:\\Users.txt”);
    @SuppressWarnings(“OverridableMethodCallInConstructor”)
    公共用户(字符串un、字符串pw、字符串a1、字符串a2、字符串a3){
    设置用户名(un);
    设置密码(pw);
    西答韦龙(a1);
    setAnswerTwo(a2);
    SETANSWER3(a3);
    }
    public void addUser(用户用户)引发IOException{
    FileWriter fw=新的FileWriter(getFile());
    try(BufferedWriter bfw=新的BufferedWriter(fw)){
    bfw.write(user.userName);
    bfw.write(用户密码);
    bfw.write(user.answerOne);
    bfw.write(用户回答2);
    bfw.write(用户回答三);
    bfw.newLine();
    }
    }
    公共静态布尔值verifyUserExists(字符串用户名)引发FileNotFoundException{
    Scanner scannedFile=新扫描仪(getFile());
    while(scannedFile.hasNext()){
    字符串搜索=scannedFile.next();
    返回search.equals(用户名);
    }
    返回false;
    }
    公共静态布尔验证密码(字符串用户名、字符串密码)引发FileNotFoundException{
    Scanner scannedFile=新扫描仪(getFile());
    while(scannedFile.hasNext()){
    字符串搜索=scannedFile.next();
    if(search.equals(用户名)){
    返回scannedFile.nextLine().equals(getMD5(密码));
    }
    }
    返回false;
    }
    公共静态字符串getMD5(字符串输入){
    试一试{
    MessageDigest md=MessageDigest.getInstance(“MD5”);
    byte[]messageDigest=md.digest(input.getBytes());
    BigInteger编号=新的BigInteger(1,messageDigest);
    字符串hashtext=number.toString(16);
    //现在,如果你真的想要全部32个字符,我们需要零填充它。
    while(hashtext.length()<32){
    hashtext=“0”+hashtext;
    }
    返回hashtext;
    }捕获(无算法异常){
    抛出新的运行时异常(e);
    }
    }
    公共静态文件getFile(){
    返回文件;
    }
    
    使用


    action=“/createUser”将调用默认上下文的URL

    http://localhost:8084/createUser 
    
    而action=“./createUser”将调用当前目录/上下文中servlet的URL模式

     http://localhost:8084/ContextName/createUser
    

    尝试将
    action=“servlets/CreateUser.java”
    更改为
    action=“servlets/CreateUser”
    我只是根据该建议运行了它,但仍然收到了相同的错误页面。我尝试更改路径和名称,以使它至少停止尝试将我指向无法在浏览器中查看的servlet。更改操作=“servlets/CreateUser.java”to action=“/CreateUser”。仍然有相同的结果。谢谢。事实证明,这是在我创建用户的逻辑中。我需要确保我的文件存在,然后才能执行任何操作。它现在可以正常工作并运行。这就是为什么它会给我404错误。找不到该文件。
    http://localhost:8084/createUser 
    
     http://localhost:8084/ContextName/createUser