Чтобы проверить, существует ли этот пользователь уже или нет в struts2

Здесь я хочу, чтобы, если пользователь пытается зарегистрироваться с кодом, который уже существует в моей таблице, он должен выдавать ошибку, которая

Этот код уже занят, попробуйте другой.

Используя Struts2, я хочу сделать это. Ниже мой класс действий.

Что я сделал: сначала я запустил запрос на выбор кода с использованием набора результатов и сохранил все результаты в переменной String temp_user, а в методе validate() я только что сравнил его с помощью метода equals(temp_user), но это не работает.

РегистрацияAction.java

package org.entity;

import java.io.*;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import javax.wsdl.Message;

import org.apache.struts2.interceptor.SessionAware;

import nl.captcha.Captcha;

import com.opensymphony.xwork2.ActionSupport;

public class RegistrationAction extends ActionSupport implements SessionAware {
    BloodBank register;
    private Map<String, Object> session;
    private String temp_user;

    public BloodBank getRegister() {
        return register;
    }

    public void setRegister(BloodBank register) {
        this.register = register;
    }

    public Map<String, Object> getSession() {
        return session;
    }

    public void setSession(Map<String, Object> session) {
        this.session = session;
    }

    public String getTemp_user() {
        return temp_user;
    }

    public void setTemp_user(String temp_user) {
        this.temp_user = temp_user;
    }

    @Override
    public String execute() throws Exception {
        try {
            Class.forName("com.mysql.jdbc.Driver");
            Connection con = DriverManager.getConnection(
                    "jdbc:mysql://localhost:3306/foryou", "root", "siddheshkk");
            System.out.println("Driver Loaded");
            Statement st12 = con.createStatement();
            PreparedStatement st = con
                    .prepareStatement("insert into bbinfo(code,name,address,city,district,contactno,stdcode,password,aname,email) "
                            + "values(?,?,?,?,?,?,?,?,?,?)");
            st.setString(1, register.getCode());
            st.setString(2, register.getBbname());
            st.setString(3, register.getAddress());
            st.setString(4, register.getCity());
            st.setString(5, register.getDistrict());
            st.setString(6, register.getNumber());
            st.setString(7, register.getStd());
            st.setString(8, register.getPassword());
            st.setString(9, register.getAname());
            st.setString(10, register.getEmail());
            st.executeUpdate();
            st.close();

            PreparedStatement st1 = con
                    .prepareStatement("insert into stockinfo(name,city,address,contact,email,code,stdcode,apositive,anegative,bpositive,bnegative,abpositive,abnegative,opositive,onegative)"
                            + "values(?,?,?,?,?,?,?,'0','0','0','0','0','0','0','0')");
            st1.setString(1, register.getBbname());
            st1.setString(2, register.getCity());
            st1.setString(3, register.getAddress());
            st1.setString(4, register.getNumber());
            st1.setString(5, register.getEmail());
            st1.setString(6, register.getCode());
            st1.setString(7, register.getStd());
            st1.executeUpdate();
            st1.close();
            System.out.println("done");
            ResultSet rs12 = st12.executeQuery("select code from bbinfo");
            while (rs12.next()) {
                temp_user = rs12.getString("code");
            }

            con.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return "success";
    }

    @Override
    public void validate() {
        super.validate();
        if (register.getCode().length() < 1 | register.getCode().equals("")) {
            addFieldError("register.code", "Mandatory Field.");
        }
        if(register.getCode().equals(getTemp_user()))
        {
            addFieldError("register.code", "This Code is already taken. Please try different one.");
        }
        if (register.getBbname().equals("") | register.getBbname().length() < 1) {
            addFieldError("register.bbname", "Invalid Name");
        }
        if (register.getAddress().equals("")) {

            addFieldError("register.address", "Invalid Address");
        }
        if (register.getCity().equals("")) {
            addFieldError("register.city", "Invalid City");

        }
        if (register.getDistrict().equals("")) {
            addFieldError("register.district", "Invalid District");

        }
        if (register.getPassword().length() > 8
                | register.getPassword().equals("")) {
            addFieldError("register.password", "Please Enter a valid Password");
        }
        if (!(register.getConfirm().equals(register.getPassword()))) {
            addFieldError("register.confirm", "Password doesnt match");
        }
        if (register.getConfirm().isEmpty()) {
            addFieldError("register.confirm", "Please enter confirmed password");
        }
        if (register.getAname().equals("")) {
            addFieldError("register.aname", "Please enter your name");
            ;
        }
        if (register.getEmail().equals("")) {
            addFieldError("register.email", "Invalid Email Id");
        } else {
            String expression = "^[\\w\\-]([\\.\\w])+[\\w]+@([\\w\\-]+\\.)+[A-Z]{2,4}$";
            CharSequence inputStr = register.getEmail();
            Pattern pattern = Pattern.compile(expression,
                    Pattern.CASE_INSENSITIVE);
            Matcher matcher = pattern.matcher(inputStr);
            if (!matcher.matches())
                addFieldError("register.email", "Invalid email address");
        }
        Captcha captcha = (Captcha) session.get(Captcha.NAME);
        if (!(captcha.isCorrect(register.getCaptchaAnswer()))) {
            addFieldError("register.captchaAnswer", "incorrect captcha");
        }

    }
}

person Community    schedule 01.07.2015    source источник
comment
Как пользователь узнает код, который вы выбрали из таблицы?   -  person Roman C    schedule 01.07.2015
comment
да, у меня есть ошибки в методе проверки, где начинается условие равенства для кода.   -  person    schedule 01.07.2015
comment
Я не понял вас, римлянин, сэр. я получил все записи, используя набор результатов в строковой переменной, а позже я сравниваю их в методе проверки   -  person    schedule 01.07.2015
comment
На самом деле я не получаю никаких ошибок. Пользователь также регистрируется с повторяющимся именем. он не дает никакой ошибки в обязательном поле :(   -  person    schedule 01.07.2015
comment
Пожалуйста, помогите мне с решением :(   -  person    schedule 01.07.2015


Ответы (2)


Ваша проблема в том, что метод validate(), запускаемый перехватчиком проверки,
выполняется до достижения действия и, следовательно, перед методом execute().

Это означает, что temp_user всегда имеет значение null при чтении в методе validate().

Вам нужно узнать, как работает Struts2, особенно когда и как вызываются перехватчики между JSP и действием.

Решение: загрузите переменную temp_user внутри метода validate().

Также прочтите Должен ли я извлекать запись базы данных на уровне представления Struts2? для обсуждения того, как сделать ваш код чище и более несвязанным, потому что все эти вещи JDBC в действии действительно уродливы.

person Andrea Ligios    schedule 02.07.2015
comment
Хорошо, большое спасибо, сэр :) но что вы имеете в виду под загрузкой переменной в методе проверки? . Строка temp_user; ResultSet rs12 = st12.executeQuery (выберите код из bbinfo); в то время как (rs12.next()) { temp_user = rs12.getString (код); } Должен ли я написать этот код в методе проверки, а затем сравнить? - person ; 02.07.2015
comment
Точно. В validate() у вас есть тот, который идет со страницы, но нет другого, который будет загружен в execute(). Загрузите его в validate() вместо execute(), если ваша цель состоит только в том, чтобы сравнить их. - person Andrea Ligios; 02.07.2015
comment
Да, сэр, я просто попробую это и дам вам знать, и если у меня получится, я отмечу ответ, который мне помог :) - person ; 02.07.2015

Спасибо @Andrea Sir за предложение, и оно мне действительно помогло. :) Я написал следующий код в методе Validate(), и мой код был успешно выполнен. Еще раз большое спасибо, сэр :), и ссылка, размещенная вами, также прояснила мою концепцию того, как следует вызывать перехватчики между JSP и Action. :) Ниже мой код.

String temp_user = null;
        try {
            Class.forName("com.mysql.jdbc.Driver");
            Connection con = DriverManager.getConnection(
                    "jdbc:mysql://localhost:3306/foryou", "root", "siddheshkk");
            System.out.println("Step 1");
            Statement st12 = con.createStatement();
            ResultSet rs12 = st12.executeQuery("select code from bbinfo");
            while (rs12.next()) {

                temp_user = rs12.getString("code");
                System.out.println("step2");
                if (register.getCode().equals(temp_user)) {
                    addFieldError("register.code",
                            "This username is already taken .Try Different one !");
                    System.out.println("sid");
                }

            }
            st12.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
person Community    schedule 02.07.2015