LINUX.ORG.RU

Проблема с сервлетами,томкатом и жсп?

 , , , ,


0

1

Есть томкат в директории %CATALINA_HOME%\webapps\ROOT есть файл index2.jsp в нем такой код

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Users</title>
</head>
<body>
<h2>Users List</h2>
<p><a href='<c:url value="/create" />'>Create new</a></p>
<table>
<tr><th>NickName</th><th>Password</th><th>email</th></tr>
<c:forEach var="user" items="${users}">
 <tr><td>${users.nickname}</td>
    <td>${users.password}</td>
    <td>${users.email}</td>
    <td>
    <a href='<c:url value="/edit?id=${user.id}" />'>Edit</a> |
    <form method="post" action='<c:url value="/delete" />' style="display:inline;">
        <input type="hidden" name="id" value="${user.id}">
        <input type="submit" value="Delete">
    </form>
 </td></tr>
</c:forEach>
</table>
</body>
</html>
При обращении http://127.0.0.1/index2.jsp открывается страница как положено. Жму на ссылку create new выдаёт 404:
HTTP Status 404 – Not Found
Type Status Report

Message /create

Description The origin server did not find a current representation for the target resource or is not willing to disclose that one exists.

Apache Tomcat/8.5.23
, насколько я понимаю нужно закинуть в томкат класс этот откомпилированый

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

/**
 *
 * @author User
 */
@WebServlet("/create")
public class CreateServlet extends HttpServlet{
    protected void doGet(HttpServletRequest request, HttpServletResponse response) 
        throws ServletException, IOException {
 
        getServletContext().getRequestDispatcher("/create.jsp").forward(request, response);
    }
    protected void doPost(HttpServletRequest request, HttpServletResponse response) 
        throws ServletException, IOException {
 
        try {
            String nickname = request.getParameter("nickname");
            String  password = request.getParameter("password");
            String  email = request.getParameter("email");
            Users users = new Users(nickname, password,email);
            UsersDB.insert(users);
            response.sendRedirect(request.getContextPath()+"/index");
        }
        catch(Exception ex) {
            getServletContext().getRequestDispatcher("/create.jsp").forward(request, response); 
        }
    }
}

Положил в директорию в эту классы D:\флешка\other\apache_tomcat\apache-tomcat-8.5.23\webapps\Example\WEB-INF\classes CreateServlet.class и IndexServlet.class Еще одна неурядица у меня есть одна строчка в таблице бд, но ее почему то не индексирует(показывает) при обращении к index2.jsp

import java.io.IOException;
import java.util.ArrayList;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

/**
 *
 * @author User
 */
@WebServlet("/")
public class IndexServlet extends HttpServlet {
     
    protected void doGet(HttpServletRequest request, HttpServletResponse response) 
        throws ServletException, IOException {
        ArrayList<Users> users = UsersDB.select();
        request.setAttribute("users",users);
          
        getServletContext().getRequestDispatcher("/index2.jsp").forward(request, response);
    }
}



Последнее исправление: Gremlin_ (всего исправлений: 4)

Еще два вот класса вспомогательных:


import java.sql.*;
import java.util.ArrayList;

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

/**
 *
 * @author User
 */
public class UsersDB {
    
 
    private static String url = "jdbc:mysql://localhost/test?serverTimezone=Europe/Moscow";
    private static String username = "root";
    private static String password = "root";
    
    public static ArrayList<Users> select() {
         
        ArrayList<Users> users = new ArrayList<Users>();
        try{
            Class.forName("com.mysql.cj.jdbc.Driver").getDeclaredConstructor().newInstance();
            try (Connection conn = DriverManager.getConnection(url, username, password)){
                  
                Statement statement = conn.createStatement();
                ResultSet resultSet = statement.executeQuery("SELECT * FROM users");
                while(resultSet.next()){
                      
                    int id = resultSet.getInt(1);
                    String nickname = resultSet.getString(2);
                    String pass = resultSet.getString(3);
                    String email = resultSet.getString(4);
                    Users user = new Users(id, nickname, pass,email);
                    users.add(user);
                }
            }
        }
        catch(Exception ex){
            System.out.println(ex);
        }
        return users;
    }
    public static Users selectOne(int id) {
         
        Users user = null;
        try{
            Class.forName("com.mysql.cj.jdbc.Driver").getDeclaredConstructor().newInstance();
            try (Connection conn = DriverManager.getConnection(url, username, password)){
                  
                String sql = "SELECT * FROM users WHERE id=?";
                try(PreparedStatement preparedStatement = conn.prepareStatement(sql)){
                    preparedStatement.setInt(1, id);
                    ResultSet resultSet = preparedStatement.executeQuery();
                    if(resultSet.next()){
 
                        int userId = resultSet.getInt(1);
                        String nickname = resultSet.getString(2);
                        String pass = resultSet.getString(3);
                        String email = resultSet.getString(4);
                        user = new Users(userId, nickname, pass,email);
                    }
                }
            }
        }
        catch(Exception ex){
            System.out.println(ex);
        }
        return user;
    }
    public static int insert(Users users) {
         
        try{
            Class.forName("com.mysql.cj.jdbc.Driver").getDeclaredConstructor().newInstance();
            try (Connection conn = DriverManager.getConnection(url, username, password)){
                  
                String sql = "INSERT INTO users (nickname,password,email) Values (?, ?,?)";
                try(PreparedStatement preparedStatement = conn.prepareStatement(sql)){
                    preparedStatement.setString(1, users.getNickName());
                    preparedStatement.setString(2, users.getPassword());
                    preparedStatement.setString(3, users.getEmail());
                    return  preparedStatement.executeUpdate();
                }
            }
        }
        catch(Exception ex){
            System.out.println(ex);
        }
        return 0;
    }
     
    public static int update(Users users) {
         
        try{
            Class.forName("com.mysql.cj.jdbc.Driver").getDeclaredConstructor().newInstance();
            try (Connection conn = DriverManager.getConnection(url, username, password)){
                  
                String sql = "UPDATE products SET nickname = ?, password = ?,email = ? WHERE id = ?";
                try(PreparedStatement preparedStatement = conn.prepareStatement(sql)){
                    preparedStatement.setString(1, users.getNickName());
                    preparedStatement.setString(2, users.getPassword());
                    preparedStatement.setString(3, users.getEmail());
                    preparedStatement.setInt(4, users.getId());
                      
                    return  preparedStatement.executeUpdate();
                }
            }
        }
        catch(Exception ex){
            System.out.println(ex);
        }
        return 0;
    }
    public static int delete(int id) {
         
        try{
            Class.forName("com.mysql.cj.jdbc.Driver").getDeclaredConstructor().newInstance();
            try (Connection conn = DriverManager.getConnection(url, username, password)){
                  
                String sql = "DELETE FROM products WHERE id = ?";
                try(PreparedStatement preparedStatement = conn.prepareStatement(sql)){
                    preparedStatement.setInt(1, id);
                      
                    return  preparedStatement.executeUpdate();
                }
            }
        }
        catch(Exception ex){
            System.out.println(ex);
        }
        return 0;
    }
}

Еще два вот класса вспомогательных:

import java.io.Serializable;

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

/**
 *
 * @author User
 */
public class Users implements Serializable {
 
    private static final long serialVersionUID = 1L;
 
    private int id;
    private String nickname;
    private String password;
    private String email;
     
    public Users(){ }
    public Users(String nickname,String password,String email){
        this.nickname = nickname;
        this.password = password;
        this.email = email;
    }
    public Users(int id, String nickname,String password,String email){
        this.id = id;
        this.nickname = nickname;
        this.password = password;
        this.email = email;
    }
     
    public int getId() {
        return id;
    }
     
    public String getNickName() {
        return nickname;
    }
 
    public void setNickName(String nickname) {
        this.nickname = nickname;
    }
 
    public String getPassword() {
        return password;
    }
 
    public void setPassword(String password) {
        this.password = password;
    }
 
    public String getEmail() {
        return email;
    }
 
    public void setEmail(String email) {
        this.email = email;
    }
 }

Gremlin_
() автор топика
Ответ на: комментарий от Gremlin_

Tomcat слушает на каком-то порту. Возможно, и на 80.

Но твое приложение в томкате не находится в /. Оно находится в субдиректории. Можешь зайти в админку томката и посмотреть, работает ли оно у тебя, и какой у него урл. И твой /create должен быть не к хосту, а к твоему приложению. Например http://127.0.0.1/myapp/create

bvn13 ★★★★★
()
Ответ на: комментарий от bvn13

Да я только что в этом разобрался, но придется create.jsp переносить из %CATALINA_HOME%\webapps\ROOT в %CATALINA_HOME%\webapps\Example\WEB-INF\classes

Gremlin_
() автор топика

Собери нормальный war-ник и деплой его по-человечески на Tomcat. А то, что ты делаешь, это даже не гланды через жопу, это вообще за гранью добра и зла.

hippi90 ★★★★★
()
Ответ на: комментарий от Gremlin_

Перенёс index2.jsp,create.jsp в %CATALINA_HOME%\webapps\Example\ И классы CreateServet.class,IndexServlet.class,Users.class,UsersDB.class в %CATALINA_HOME%\webapps\Example\WEB-INF\classes Вроде ошибок нет , но в базу не заносятся юзеры

Gremlin_
() автор топика
Ответ на: комментарий от Gremlin_

Закинул мусклконнектор в либ томката, теперь во что пишет

HTTP Status 500 – Internal Server Error
Type Exception Report

Message javax.el.PropertyNotFoundException: Property [nickname] not found on type [Users]

Description The server encountered an unexpected condition that prevented it from fulfilling the request.

Exception

org.apache.jasper.JasperException: javax.el.PropertyNotFoundException: Property [nickname] not found on type [Users]
	org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:565)
	org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:481)
	org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:385)
	org.apache.jasper.servlet.JspServlet.service(JspServlet.java:329)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:742)
	org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
	IndexServlet.doGet(IndexServlet.java:28)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:635)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:742)
	org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
Root Cause

javax.el.PropertyNotFoundException: Property [nickname] not found on type [Users]
	javax.el.BeanELResolver$BeanProperties.get(BeanELResolver.java:260)
	javax.el.BeanELResolver$BeanProperties.access$300(BeanELResolver.java:212)
	javax.el.BeanELResolver.property(BeanELResolver.java:347)
	javax.el.BeanELResolver.getValue(BeanELResolver.java:92)
	org.apache.jasper.el.JasperELResolver.getValue(JasperELResolver.java:110)
	org.apache.el.parser.AstValue.getValue(AstValue.java:169)
	org.apache.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:184)
	org.apache.jasper.runtime.PageContextImpl.proprietaryEvaluate(PageContextImpl.java:944)
	org.apache.jsp.index2_jsp._jspx_meth_c_005fforEach_005f0(index2_jsp.java:207)
	org.apache.jsp.index2_jsp._jspService(index2_jsp.java:137)
	org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:742)
	org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:443)
	org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:385)
	org.apache.jasper.servlet.JspServlet.service(JspServlet.java:329)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:742)
	org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
	IndexServlet.doGet(IndexServlet.java:28)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:635)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:742)
	org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
Note The full stack trace of the root cause is available in the server logs.

Gremlin_
() автор топика
Ответ на: комментарий от Gremlin_

Какой-то косяк с переменной не пойму в чем дело:

HTTP Status 500 – Internal Server Error
Type Exception Report

Message An exception occurred processing JSP page [/index2.jsp] at line [15]

Description The server encountered an unexpected condition that prevented it from fulfilling the request.

Exception

org.apache.jasper.JasperException: An exception occurred processing JSP page [/index2.jsp] at line [15]

12: <tr><th>NickName</th><th>Password</th><th>email</th></tr>
13: <c:forEach var="user" items="${users}">
14:  <tr>
15:     <td>${user.NickName}</td>
16:     <td>${user.password}</td>
17:     <td>${user.email}</td>
18:     <td>


Stacktrace:
	org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:588)
	org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:481)
	org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:385)
	org.apache.jasper.servlet.JspServlet.service(JspServlet.java:329)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:742)
	org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
	IndexServlet.doGet(IndexServlet.java:28)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:635)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:742)
	org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
Root Cause

javax.el.PropertyNotFoundException: Property [NickName] not found on type [Users]
	javax.el.BeanELResolver$BeanProperties.get(BeanELResolver.java:260)
	javax.el.BeanELResolver$BeanProperties.access$300(BeanELResolver.java:212)
	javax.el.BeanELResolver.property(BeanELResolver.java:347)
	javax.el.BeanELResolver.getValue(BeanELResolver.java:92)
	org.apache.jasper.el.JasperELResolver.getValue(JasperELResolver.java:110)
	org.apache.el.parser.AstValue.getValue(AstValue.java:169)
	org.apache.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:184)
	org.apache.jasper.runtime.PageContextImpl.proprietaryEvaluate(PageContextImpl.java:944)
	org.apache.jsp.index2_jsp._jspx_meth_c_005fforEach_005f0(index2_jsp.java:208)
	org.apache.jsp.index2_jsp._jspService(index2_jsp.java:137)
	org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:742)
	org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:443)
	org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:385)
	org.apache.jasper.servlet.JspServlet.service(JspServlet.java:329)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:742)
	org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
	IndexServlet.doGet(IndexServlet.java:28)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:635)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:742)
	org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
Note The full stack trace of the root cause is available in the server logs.

Apache Tomcat/8.5.23

Gremlin_
() автор топика
Ответ на: комментарий от Gremlin_

Заработало, поменял в index2.jsp строку на ${user.nickname}, но пришлось в классе Users, метод getNickName поменять на getNickname

Gremlin_
() автор топика
Ответ на: комментарий от Gremlin_

Есть определённые правила, по которым JSP определяет метод. Когда ты пишешь nickname, JSP прибавляет get и делает первую букву большой. Именно так и должен называться метод. Если хочешь вызывать метод getNickName, значит пиши в JSP nickName. Подробней почитать можешь в спецификации Java Beans.

Legioner ★★★★★
()
Последнее исправление: Legioner (всего исправлений: 1)
Ответ на: комментарий от Legioner

А вот такие мелочи особо не заметишь, пока не столкнешься с этим и не знаешь как решить, потому что это мой 1й веб проект

Gremlin_
() автор топика
Ответ на: комментарий от Gremlin_

тогда учись по-человечески делать. Если тебе действительно нужен томкат, тогда собирай war-файл и деплой его в томкат (хоть руками из админки). а если ты лишь нагуглил про томкат, что через него тоже можно, а сам точно не уверен, что тебе он нужен, то выкинь его, возьми SpringBoot и делай на нем (он самозапускаемый, будет все из коробки). И да, JSP - это как бы уже прошлый век. Бери JSF. Если выберешь SpringBoot, то тогда и ThymeLeaf - тоже из коробки.

bvn13 ★★★★★
()

Зачем тебе этот весь этот изврат? Ничего кроме hello world ты не сделаешь. Для вебни специально сделали springboot+hibernate с кешами и аннотациями. И если ты уж решил херачить императивщину, то зачем тебе ява? Пиши всё на си/плюсах. Ява нужна, чтобы угарать по рефлексии, а не для вот этого вот.

Еще два вот класса вспомогательных

Ты на каждую сущность собрался писать такую портянку? Представь, что их 200+.

crutch_master ★★★★★
()
Ответ на: комментарий от Gremlin_

Читайте документацию по Тomcat и JSP. Хоть Tomcat один из самых простых серверов приложений на Java, совсем без ознакомления пользоваться не получится.

Предыдущие ораторы наболтали суши. Поэтому мне вступать в обсуждение неохота и ограничусь вышеуказанным.

Partisan ★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.