#java #xml #jsp #servlets #netbeans
#java #xml #jsp #сервлеты #netbeans
Вопрос:
Я создаю приложение, которое имеет два значения и возвращает множество различных ответов на функции (сложение, вычитание, деление, умножение и т. Д.). Это сделано с использованием JSP, и у меня есть индекс и ошибка JSP. Когда я пытаюсь запустить приложение с включенным error.jsp, оно всегда возвращает эту страницу, что бы я ни пытался, потому что в моем коде что-то не так, но я не понимаю, что. В приложении также есть раздел с простыми числами, в котором вы можете ввести число, нажав ok, и если число является простым, ничего не произойдет, но если это не так, вы получите сообщение об ошибке. Next prime и previous prime просто возвращают следующие и предыдущие простые числа из введенного вами числа.
index.jsp
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<%@page errorPage="error.jsp"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Home Page</title>
</head>
<body>
<h1>Calculations using JSP pages</h1>
<jsp:useBean id="math" scope="session" class="beans.MathBean" />
<jsp:useBean id="primenumber" scope="session" class="beans.PrimeBean" />
<jsp:setProperty name="math" property="*" />
<jsp:setProperty name="primenumber" property="prime" />
<form name="form1" method="post">
<table>
<tr>
<td>Number 1: </td>
<td><input type="text" name="numberA" value="${math.numbera}" style="width: 130px"</td>
</tr>
<tr>
<td>Number 2: </td>
<td><input type="text" name="numberB" value="${math.numberb}" style="width: 130px"</td>
</tr>
<tr>
<td colspan="2" style="text-align: right"><input type="submit" value="OK"</td>
</tr>
</table>
</form>
<table>
<tr>
<td>Add</td><td>${math.add()}</td>
</tr>
<tr>
<td>Subtract</td><td>${math.subtract()}</td>
</tr>
<tr>
<td>Multiply</td><td>${math.multiply()}</td>
</tr>
<tr>
<td>Divide</td><td>${math.divide()}</td>
</tr>
</table>
<form name="form2" method="post">
<input type="text" name="prime" value="${primenumber.prime}"/> amp;nbsp;amp;nbsp;
<input type="submit" value="OK"/>
</form>
<p><a href="Primes?number=next">Next Prime</a>
<p><a href="Primes?number=previous">Previous Prime</a>
</body>
</html>
Error.jsp
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<%@page isErrorPage="true"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Error page</title>
</head>
<body>
<h1>Error!</h1>
<p><a href="index.jsp">back 2 menu</a></p>
</body>
</html>
web.xml файл просто используется по умолчанию с добавлением welcome-file-list, welcome-file с индексом.jsp в нем.
MathBean:
package beans;
import java.io.Serializable;
public class MathBean implements Serializable{
private long numbera, numberb;
public MathBean(long numbera, long numberb) {
this.numbera = numbera;
this.numberb = numberb;
}
public long getNumbera() {
return numbera;
}
public void setNumbera(long numbera) {
this.numbera = numbera;
}
public long getNumberb() {
return numberb;
}
public void setNumberb(long numberb) {
this.numberb = numberb;
}
public long add() {
return numbera numberb;
}
public long subtract() {
return numbera - numberb;
}
public long divide() {
if (numberb == 0) {
return 0;
}
return numbera / numberb;
}
public long multiply() {
return numbera * numberb;
}
}
PrimeBean:
package beans;
public class PrimeBean {
private static final long max = 9223372036854775783L;
private long prime = 2;
public PrimeBean() {
}
public long getPrime() {
return prime;
}
public void setPrime(long p) throws Exception {
if(!isPrime(p)) throw new Exception("Illegal number");
prime = p;
}
private static boolean isPrime(long p) {
if (p == 2 || p == 3 || p == 5 || p == 7) return true;
if(p<11||p%2 == 0 ) return false;
for(long t = 3, m = (long)Math.sqrt(p) 1; t <= m; t =2) if(p % t == 0) return false;
return true;
}
public boolean next() {
if (prime < max) {
if (prime == 2) prime = 3;
else for(prime = 2; !isPrime(prime); prime = 2);
return true;
}
return false;
}
public boolean previous() {
if (prime > 2) {
if(prime == 3) prime = 2;
else for(prime -= 2; !isPrime(prime); prime -= 2);
return true;
}
return false;
}
}
PrimeServlet:
package servlets;
import beans.PrimeBean;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet(name = "Primes", urlPatterns = {"/Primes"})
public class PrimeServlet extends HttpServlet {
protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws IOException{
PrimeBean bean = (PrimeBean) request.getSession().getAttribute("primenumber");
String number = request.getParameter("number");
if (number.equals("next")) bean.next(); else bean.previous();
response.sendRedirect("index.jsp");
}
// <editor-fold defaultstate="collapsed" desc="HttpServlet methods. Click on the sign on the left to edit the code.">
/**
* Handles the HTTP <code>GET</code> method.
*
* @param request servlet request
* @param response servlet response
* @throws ServletException if a servlet-specific error occurs
* @throws IOException if an I/O error occurs
*/
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
processRequest(request, response);
}
/**
* Handles the HTTP <code>POST</code> method.
*
* @param request servlet request
* @param response servlet response
* @throws ServletException if a servlet-specific error occurs
* @throws IOException if an I/O error occurs
*/
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
processRequest(request, response);
}
/**
* Returns a short description of the servlet.
*
* @return a String containing servlet description
*/
@Override
public String getServletInfo() {
return "Short description";
}// </editor-fold>
}
Извините за публикацию всего кода, но я действительно потерян и не понимаю, почему это не работает. Вся помощь приветствуется.
Спасибо!
Комментарии:
1. Есть ли трассировка стека исключений?
2. Вы можете получить обратную трассировку в веб-браузере или, возможно, в журнале сервера. Будет сложно отлаживать без обратной трассировки.
3. Вероятно, слишком много кода, чтобы определить проблему. Мой совет состоял бы в том, чтобы сузить проблему — либо запустить в debug и выполнить пошаговое выполнение, либо добавить немного протоколирования (в его простейшей форме, которая может быть просто частью System.out, например. «запуск метода умножения — numbera =» numbera «, numberb =» numberb и т. Д.
Ответ №1:
В реализации есть как минимум 2 проблемы:
-
У компонентов должен быть общедоступный конструктор по умолчанию без аргументов:
public MathBean() { ...
У вас есть
public MathBean(long numbera, long numberb) { ...
-
Теги ввода HTML
numberA
numberB
иsubmit
onindex.jsp
не закрываются>
.
Комментарии:
1. Устранение обеих этих проблем заставило все работать. Большое вам спасибо!