使用 JSF、JDBC 和 HttpServlet 在 dataTable 中搜索和检索数据 [英] Search and retrieve data in dataTable using JSF, JDBC and HttpServlet

查看:21
本文介绍了使用 JSF、JDBC 和 HttpServlet 在 dataTable 中搜索和检索数据的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

以下是我的代码我的豆子

following is my code my bean

import java.util.logging.Level;
import java.util.logging.Logger;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import java.io.*;
import java.util.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.sql.*;

/**
 *
 * @author utilisateur
 */
@ManagedBean(name="Beansearch")
@SessionScoped
public class Beansearch extends HttpServlet {
    ResultSet rs;
    private String cond;

    public String getcond() {
        return this.cond;
    }
    public void setcond(String cond) {
        this.cond= cond;
        }


   private List perInfoAll = new ArrayList();

    private int i;
public  List getperInfoAll(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException, SQLException {
    String value = req.getParameter("cond");
        try {
            Class.forName("oracle.jdbc.driver.OracleDriver");
        } catch (ClassNotFoundException ex) {
            Logger.getLogger(Beansearch.class.getName()).log(Level.SEVERE, null, ex);
        }
         Connection con = null;
        try {
            con = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:gmao", "pfe", "gmao");
        } catch (SQLException ex) {
            Logger.getLogger(Beansearch.class.getName()).log(Level.SEVERE, null, ex);
        }
         Statement st = null;
        try {
            st = con.createStatement();
        } catch (SQLException ex) {
            Logger.getLogger(Beansearch.class.getName()).log(Level.SEVERE, null, ex);
        }
        try {
             rs = st.executeQuery("selectusername, jobposition from  user_details="+value+"");
            /** Creates a new instance of Beansearch */
        } catch (SQLException ex) {
            Logger.getLogger(Beansearch.class.getName()).log(Level.SEVERE, null, ex);
        }

    while(rs.next())
          {

            perInfoAll.add(i,new perInfo(rs.getString(1),rs.getString(2)));

            i++;

          }
return perInfoAll;
}
public class perInfo {

 private String username;
private String jobposition;


public perInfo(String username,String jobposition) {
this.username = username;
this.jobposition = jobposition;


}

public String getusername() {
return username;
}

public String getjobposition() {
return jobposition;
}



}
}

我的页面jsf

enter code here

<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
   "http://www.w3.org/TR/html4/loose.dtd">
<%@ taglib uri="http://java.sun.com/jsf/html" prefix="h"%>
<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f"%>
<f:view>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>JSP Page</title>
    </head>
    <body>
      <h:form>


        <h:dataTable id="dt1" value="#{Beansearch.perInfoAll}" var="item" bgcolor="#F1F1F1" border="10" cellpadding="5" cellspacing="3"  rows="4" width="50%" dir="LTR" frame="hsides" rules="all" summary="This is a JSF code to create dataTable." >

<f:facet name="header">
        <h:outputText value="This is 'dataTable' demo" />
</f:facet>


<h:column>
        <f:facet name="header">
        <h:outputText value="First Name" />
        </f:facet>
             <h:outputText style=""  value="#{item.username}" ></h:outputText>
</h:column>

<h:column>
        <f:facet name="header">
        <h:outputText value="Last Name"/>
        </f:facet>
             <h:outputText  value="#{item.jobposition}"></h:outputText>
</h:column>

此代码用于在 jsf 页面中显示数据库中的数据,我需要的是如何通过输入搜索条件来显示数据并仅显示请求的相应元素(select * from mytable where id ="+v+")

this code used to display data from a database in a jsf page what I need is how to display data by entering the search criteria and show only the corresponding elements with the request (select * from mytable where id ="+v+")

问题是我们如何获得v"(输入值)如何更改我的代码以实现这一点(在文本框中输入搜索条件并仅检索相应的元素)你能帮我吗,如果可能的话,给我一个例子谢谢

the question is how we can get "v" (enter value) how change my code to realize this(entering the search criteria in textbox and retrieve only the corresponding elements) can you help me please and give me an example if it is possible thanks

推荐答案

代码错误太多,不从头开始重写几乎不可能给出合适的答案.

There's too much wrong in the code that it's nearly impossible to give a suitable answer without rewriting from scratch.

你似乎完全误解了 JSF 的用途.

You seem to completely misunderstand the purpose of JSF.

@ManagedBean(name="Beansearch")
@SessionScoped
public class Beansearch extends HttpServlet {

为什么要扩展HttpServlet?去掉它.在 JSF 中,所有请求/响应处理都已经由 FacesServlet 处理,您应该已经在 web 应用程序的 web.xml 中声明了它.当您想要收集用户输入时,您应该使用 JSF 输入组件,如 <h:inputText> 并以通常的 JSF 方式将它们绑定到 bean 属性.

Why does it extend HttpServlet? Remove it. In JSF all the request/response handling is already handled by the FacesServlet which you should already have declared in the webapp's web.xml. When you want to collect user input, you should be using the JSF input components like <h:inputText> and bind them to a bean property the usual JSF way.

您似乎也完全误解了异常处理.

You seem to completely misunderstand the exception handling as well.

Connection con = null;
try {
    con = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:gmao", "pfe", "gmao");
} catch (SQLException ex) {
    Logger.getLogger(Beansearch.class.getName()).log(Level.SEVERE, null, ex);
}
Statement st = null;
try {
    st = con.createStatement();
} catch (SQLException ex) {
    Logger.getLogger(Beansearch.class.getName()).log(Level.SEVERE, null, ex);
}
try {
     rs = st.executeQuery("selectusername, jobposition from  user_details="+value+"");
    /** Creates a new instance of Beansearch */
} catch (SQLException ex) {
    Logger.getLogger(Beansearch.class.getName()).log(Level.SEVERE, null, ex);
}

您只是记录异常并继续代码流,而不是中止它并将问题通知最终用户.发生异常时,您不应继续执行代码流.您应该抛出异常并将其传播到容器的默认或自定义错误页面,或者至少向最终用户显示FacesMessage.

You're only logging the exception and continuing the code flow instead of aborting it and informing the enduser about the problem. You should not be continuing the code flow when an exception occurs. You should throw the exception and propagate it to the container's default or customized error page or at least display a FacesMessage to the enduser.

您似乎也没有意识到 SQL 注入风险.

You seem to not be aware about SQL injection risks as well.

rs = st.executeQuery("selectusername, jobposition from  user_details="+value+"");

在 SQL 字符串中连接未经处理的用户控制输入数据为SQL注入攻击敞开大门.您应该使用 PreparedStatement 代替.除此之外,SQL 语法也是无效的.SELECT 命令后需要有一个空格,并且需要使用 WHERE 子句.

Concatenating unsanitized user-controlled input data in a SQL string puts the doors wide open to SQL injection attacks. You should be using PreparedStatement instead. Apart from that, the SQL syntax is also invalid. There needs to be a space after the SELECT command and you need to use a WHERE clause.

不是技术问题,但您似乎使用的是 JSF 2.0...

Not a technical problem, but you seem to be using JSF 2.0...

@ManagedBean(name="Beansearch")
@SessionScoped

...然而您使用的是劣等的 JSP 而不是它的后继 Facelets 作为视图技术.

... and yet you're using the inferior JSP instead of its successor Facelets as view technology.

<%@page contentType="text/html" pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsf/html" prefix="h"%>
<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f"%>


我强烈建议你先把这个项目搁置一旁,先通过一本像样的书/教程来学习基本的 Web 开发、JSF 2.0、JDBC 和 SQL 概念.如果没有先通过书籍/教程提供的简单示例了解基本概念,请不要立即开始您的项目.它只会以彻底的灾难告终.


I strongly recommend you to put this project aside and first work yourself through a decent book/tutorial to learn about the basic web development, JSF 2.0, JDBC and SQL concepts first. Do not work on your project immediately without having learnt the basic concepts first by simple examples provided by the books/tutorials. It will only end up in a complete disaster.

尽管如此,这里有一个基本的启动示例,说明 JSF 表单和 bean 应该是什么样子:

Nonetheless, here's a basic kickoff example of how the JSF form and the bean should look like:

<h:form>
    <h:inputText value="#{bean.query}" required="true" />
    <h:commandButton value="Search" action="#{bean.search}" />
    <h:messages />
</h:form>
<h:dataTable value="#{bean.users}" var="user" rendered="#{not empty bean.users}">
    <h:column>#{user.username}</h:column>
    <h:column>#{user.jobposition}</h:column>
</h:dataTable>
<h:outputText value="No matches found!" rendered="#{not empty bean.query and empty bean.users}" />

@ManagedBean
@RequestScoped
public class Bean {

    private String query;
    private List<User> users;

    public void search() throws SQLException {
        users = new UserDAO().search(query);
    }

    // Getters+setters.
}

UserDAO#list() 方法如下所示:

public List<User> search(String query) throws SQLException {
    List<User> users = new ArrayList<User>();

    try (
        Connection connection = database.getConnection();
        PreparedStatement statement = connection.prepareStatement("SELECT username, jobposition FROM user_details WHERE username LIKE ?");
    ) {
        statement.setString(1, "%" + query + "%");

        try (ResultSet resultSet = statement.executeQuery()) {
            while (resultSet.next()) {
                User user = new User();
                user.setUsername(resultSet.getString("username"));
                user.setJobposition(resultSet.getString("jobposition"));
                users.add(user);
            }
        }
    }

    return users;
}

祝你好运.实际上,先花一些时间学习基本概念.这将需要几周时间.不要太专注于你当前的项目,否则它会花费更长的时间.您可以从我们的 JSF 维基页面开始.

Good luck. And really, invest some time in learning the basic concepts first. It will take some weeks. Do not concentrate too much on your current project, it would after all otherwise take much longer. You can get started at our JSF wiki page.

这篇关于使用 JSF、JDBC 和 HttpServlet 在 dataTable 中搜索和检索数据的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆