【问题标题】:Retrieving data with JSP (JSTL) from a Java MVC and JDBC [duplicate]使用 JSP (JSTL) 从 Java MVC 和 JDBC 检索数据 [重复]
【发布时间】:2016-07-14 23:44:06
【问题描述】:

我是 Servlet 和 MVC Web 编程的新手。到目前为止,我已经开发了一个基本的 CRUD 项目,并想添加一个搜索功能。我想使用 JSP 文件与 servlet 进行通信并使用标签(我在措辞上遇到了问题,但我希望下面的代码能够解决这个问题)。

我的 DAO 的一部分

public List<Courses> getAllCourses() {
    // TODO Auto-generated method stub
    List<Courses> courseList = new ArrayList<Courses>();
    try {
        Statement statement = conn.createStatement();
        ResultSet resultSet = statement.executeQuery( "select * from courses" );
        while( resultSet.next() ) {
            Courses course = new Courses();
            course.setCourseid( resultSet.getInt( "courseid" ) );
            course.setCoursename( resultSet.getString( "coursename" ) );
            course.setFaculty( resultSet.getString( "faculty" ) );
            course.setCourseSpecification( resultSet.getString( "courseSpecification" ) );
            course.setDuration( resultSet.getInt( "duration" ) );
            courseList.add(course);
        }
        resultSet.close();
        statement.close();
    } catch (SQLException e) {
        e.printStackTrace();
    }
    return courseList;
}

public void findCourse(Courses course) {

try { Statement statement = conn.createStatement();
ResultSet resultSet = statement.executeQuery( "select * from courses where coursename=?" );
while( resultSet.next() ) {
Courses course1 = new Courses();
course1.setCourseid( resultSet.getInt( "courseid" ) );
course1.setCoursename( resultSet.getString( "coursename" ) );
course1.setFaculty( resultSet.getString( "faculty" ) );
course1.setCourseSpecification(resultSet.getString("courseSpecification"));
course1.setDuration( resultSet.getInt( "duration" ) );

}
resultSet.close();
statement.close();
} catch (SQLException e) {
e.printStackTrace();
}
return;
}

小服务

@WebServlet(name = "GetStudent", urlPatterns = {"/GetStudent"})
public class FindCourse extends HttpServlet {

private static final long serialVersionUID = 1L;
  @EJB private CourseDao courseDAO;


protected void processRequest(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
    Courses course = new Courses();
    String coursename = request.getParameter("coursename");   

    Courses course1= courseDAO.getCourse(course, coursename);
    request.setAttribute("Courses", course1);
    request.getRequestDispatcher("findCourse.jsp").forward(request, response);
}


@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
    processRequest(request, response);
}


@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
    processRequest(request, response);
}

}

JSP

<form action="FindCourse" method="GET">
<input type="text" name="coursename" />
<c:forEach var="course" items="${courses}">
<td><a href="${pageContext.request.contextPath}/FindCoursecoursename=${course.coursename}">${course.coursename}</a></td>

我希望对这段代码有一个很好的解释,因为它大部分来自教程等,我非常渴望学习。因此,我希望表单能够获取用户输入并检索与查询匹配的课程并显示课程,或者如果有多个课程与名称匹配,则可能显示课程。目前我收到“找不到资源”错误。

作为一个附带问题,如果允许,视图和控制器之间的数据形式是什么?有没有办法对其进行规范或强制它采用 JSON/XML?如何将这个简单的 MVC 变成 RESTFUL 服务?我不希望复杂的答案只是一些正确方向的指针。总的来说,我发现这非常愉快和具有挑战性。谢谢。

【问题讨论】:

    标签: java jsp servlets model-view-controller jdbc


    【解决方案1】:

    servlet 是您的网络应用程序的核心。它用作处理用户 (http) 请求并生成响应并将其发送回用户的控制器(通常以 JSP 页面的形式,但也可以是图像、pdf 文档、JSON 响应或任何其他内容对应于预定义的 http MIME 类型)。

    Jsp 页面 基本上有两个目的:1)它们向用户呈现响应内容,2)它们允许用户输入发送到服务器的信息(然后存储在那里或用于过滤以创建不同的响应)。 JSP 页面通常不应该被滥用,业务逻辑应该放在 servlet 中,而 JSP 页面应该只有最少的 JAVA 代码(这通常意味着您将使用 JSTL 和 EL(Expression lanhuage)并尽量避免使用 scriptlet尽可能)

    您的网络应用程序中的

    模型是您正在处理的数据。一个示例是一个简单的 POJO(例如 Courses),它包含 Course 表具有的所有字段(以及相应的 getter/setter 方法)。通常,控制器将通过 DAO(或其他方式)访问此模型并对其进行更改。

    关于数据格式,JSP 是在服务器上渲染的,所以普通的 Java 对象可以在 servlet(控制器)和 JSP 页面之间使用。 当然,当您通过 HTML 表单(作为 JSP 页面的一部分)发送数据时,默认情况下,表单数据将以 application/x-www-form-urlencoded 格式发送。 (这将是表单元素的 enctype 属性)。如果您使用文件上传作为表单的一部分,则必须将数据格式设置为 multipart/form-data。 (据我所知,浏览器应该只支持这两种输入格式)

    现在,当您不使用浏览器并想要创建 REST Web 服务时,您将不得不手动进行序列化/反序列化。这将涉及创建 HTTP 客户端并针对 REST 服务的 URL 发出 HTTP 请求 (GET/POST)。实际数据必须被序列化(如 JSON、XML、application-x-www-form-urlencoded 等)并附加到请求中。必须对响应进行反序列化。

    就用户输入处理而言,您应该执行类似的操作

    //servlet
    String courseName = request.getParameter("coursename"); //get the argument
    //and then modify the sql query
    ResultSet resultSet = statement.executeQuery( "select * from courses where coursename='"+courseName+"'";
    

    请注意,使用 PreparedStatement 比使用 Statement 要好得多(因为 PreparedStatement 更快、更安全(防止 sql 注入攻击)

    至于错误,贴出整个堆栈跟踪。

    【讨论】:

    • 我不确定如何评论代码,但我很确定我已经修复了 doGet 方法。我需要 doPost 来执行此功能吗?我也坚持用jsp在视图中显示它。我得到“找不到资源”,所以我需要进行一些调试。
    • 我建议您更新您的原始问题并提出一个特定问题(仅一个)以获得最佳答案。你目前形式的问题太宽泛了,所以我的回答也很笼统:)
    • 只有当你有一个使用了 (method="post") 的 html 表单元素时,你才需要一个 doPost。你得到“找不到资源”,但从哪里来?请发布整个堆栈跟踪(如您在控制台中看到的那样)
    • 是的,我猜。非常感谢!!! :)
    猜你喜欢
    • 2014-09-22
    • 1970-01-01
    • 1970-01-01
    • 2013-02-15
    • 2011-05-06
    • 2011-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多