.JSP和servlet连接到.java类
我无法运行我的程序。它应该从JSP页面获取信息到servlet,以便通过java类中的方法进行验证。然后,一旦验证,servlet确定是将消息发送到上一个JSP页面还是发送到成功的JSP页面。当我运行该程序时,它会将我带到RegisterUser.jsp页面。我输入信息,然后点击提交。它把我拖到一个404找不到的页面。该链接说它正在尝试将我指向CreateUser.java servlet。它不应该那样做。任何帮助都将不胜感激,无论是我可以找到信息的链接还是一些实际的解决方案帮助。多谢各位.JSP和servlet连接到.java类,java,jsp,servlets,Java,Jsp,Servlets,我无法运行我的程序。它应该从JSP页面获取信息到servlet,以便通过java类中的方法进行验证。然后,一旦验证,servlet确定是将消息发送到上一个JSP页面还是发送到成功的JSP页面。当我运行该程序时,它会将我带到RegisterUser.jsp页面。我输入信息,然后点击提交。它把我拖到一个404找不到的页面。该链接说它正在尝试将我指向CreateUser.java servlet。它不应该那样做。任何帮助都将不胜感激,无论是我可以找到信息的链接还是一些实际的解决方案帮助。多谢各位 Cr
@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);
}
}
}
新用户注册
所需信息
用户名:
密码:
最喜欢的度假地点:
母亲的娘家姓:
第一只宠物的名字:
${MESSAGE}
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