JDBC整理

22151 ワード

データベースプロファイル
dbを作成します.propertiesリソースファイル、構成情報の保存
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/javaweb?useSSL=true&useUnicode=true&characterEncoding=utf-8
username=root
password=123456

データベース共通クラスの操作
daoパッケージを作成し、BaseDaoクラスを作成
import java.io.IOException;
import java.io.InputStream;
import java.sql.*;
import java.util.Properties;

public class BaseDao {
    private static String driver;
    private static String url;
    private static String username;
    private static String password;
    //     ,         
    static {
        Properties properties = new Properties();
        //             
        InputStream is = BaseDao.class.getClassLoader().getResourceAsStream("db.properties");
        try {
            properties.load(is);
        } catch (IOException e) {
            e.printStackTrace();
        }
        driver = properties.getProperty("driver");
        url = properties.getProperty("url");
        username = properties.getProperty("username");
        password = properties.getProperty("password");
    }
    //        
    public static Connection getConnection(){
        Connection connection = null;
        try {
            Class.forName(driver);
            connection = DriverManager.getConnection(url,username,password);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return connection;
    }

    //           
    public static ResultSet execute(Connection con, PreparedStatement pre, ResultSet rs, String sql, Object[] params) throws SQLException {
       rs=null;
       if(con!=null){
           pre = con.prepareStatement(sql);
           for (int i = 0; i < params.length; i++) {
               pre.setObject(i+1,params[i]);
           }
           rs = pre.executeQuery();
       }
       return rs;
    }

    //            
    public static int execute(Connection con, PreparedStatement pre, String sql, Object[] params) throws SQLException {
        int updateRows = 0;
        if(con!=null){
            pre = con.prepareStatement(sql);
            for (int i = 0; i < params.length; i++) {
                pre.setObject(i+1,params[i]);
            }
            updateRows = pre.executeUpdate();
        }
        return updateRows;
    }

    //    
    public static boolean closeResource(Connection con, PreparedStatement pre, ResultSet rs){
        boolean flag = true;
        if(con!=null){
            try{
                con.close();
                con = null; //GC  
            }catch (SQLException e){
                e.printStackTrace();
                flag = false;
            }
        }
        if(pre!=null){
            try {
                pre.close();
                pre = null;
            } catch (SQLException e) {
                e.printStackTrace();
                flag = false;
            }
        }
        if(rs!=null){
            try {
                rs.close();
                rs = null;
            } catch (SQLException e) {
                e.printStackTrace();
                flag = false;
            }
        }
        return flag;
    }
}

キャラクタコーディングフィルタ
filterパッケージを作成し、パッケージの下にCharacterEncodingFilterクラスを作成します.
import javax.servlet.*;
import java.io.IOException;
public class CharacterEncodingFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {}

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        request.setCharacterEncoding("utf-8");
        response.setCharacterEncoding("utf-8");
        response.setContentType("text/html; charset=utf-8");
        chain.doFilter(request,response);
    }

    @Override
    public void destroy() {}
}

Webでxmlの下でコードフィルタを登録し、パスは自分の必要に応じて変更します.


    CharacterEncodingFilter
    com.qiu.filter.CharacterEncodingFilter


    CharacterEncodingFilter
    /*


エンティティ・オブジェクトの作成
pojoパッケージを作成し、データベースに基づいて対応するエンティティクラスを作成します.
userテーブルの例として、Userクラスを作成し、データベースフィールドに基づいて対応するプライベート属性を作成し、get/setメソッドを作成し、パラメトリック/無パラメトリック構築メソッドを作成します.
データベース操作エンティティークラス
userパッケージを作成し、UserDaoインタフェースを作成し、インタフェース向けにプログラミングします.
public interface UserDao {
    //          
    public User getLoginUser(Connection con, String username, String password) throws SQLException;

    //        
    public int updatePwd(Connection con, String username, String password)throws SQLException;
}

インタフェース実装クラスの作成
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

public class UserDaoImpl implements UserDao {
    //        
    public User getLoginUser(Connection con, String username, String password) throws SQLException {
        PreparedStatement pre = null;
        ResultSet rs = null;
        User user = null;
        if(con!=null){
            String sql = "select * from user where username=? and password=?";
            Object[] params = {username,password};
            rs = BaseDao.execute(con, pre, rs, sql, params);
            if(rs.next()){
                user = new User();
                user.setId(rs.getInt("id"));
                user.setUsername(rs.getString("username"));
                user.setPassword(rs.getString("password"));
            }
            BaseDao.closeResource(null,pre,rs);
        }
        return user;
    }

    //        
    public int updatePwd(Connection con, String username, String password) throws SQLException {
        PreparedStatement pre = null;
        int updateRows = 0;
        if(con!=null){
            String sql = "update user set password = ? where username = ?";
            Object[] params = {password,username};
            updateRows = BaseDao.execute(con, pre, sql, params);
            BaseDao.closeResource(null, pre, null);
        }
        return updateRows;
    }
}

ビジネス層インタフェースおよび実装クラス
サービスパッケージを作成し、サービスパッケージの下にuserパッケージを作成します.
次に、UserServiceインタフェースを作成します.
public interface UserService {
    //      
    public User login(String username, String password);

    //    ID     
    public boolean updatePwd(String username, String password);
}

インタフェース実装クラスUserServiceImplの作成
public class UserServiceImpl implements UserService {
    //       dao ,       dao 
    private UserDao userDao;
    public UserServiceImpl(){
        userDao = new UserDaoImpl();
    }

    @Override
    public User login(String username, String password) {
        Connection con = null;
        User user = null;
        con = BaseDao.getConnection();
        //                  
        try {
            user = userDao.getLoginUser(con,username,password);
        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            BaseDao.closeResource(con,null,null);
        }
        return user;
    }

    @Override
    public boolean updatePwd(String username, String password){
        Connection con = null;
        boolean flag = false;
        //    ID     
        try{
            con = BaseDao.getConnection();
            if(userDao.updatePwd(con, username, password)>0){
                flag=true;
            }
        }catch (SQLException e){
            e.printStackTrace();
            try {
                con.rollback();//       
            } catch (SQLException ex) { ex.printStackTrace(); }
        }finally {
            BaseDao.closeResource(con,null,null);
        }
        return flag;
    }
}

制御層実装クラス
servletパッケージを作成し、userパッケージを作成します.
ログイン要求を処理するためにuserパッケージの下にLoginServiceクラスを確立する
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class LoginServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //        
        String username = req.getParameter("username");
        String password = req.getParameter("password");

        //              ,     
        UserService userService = new UserServiceImpl();
        User user = userService.login(username, password);

        if(user!=null){
            //       Session 
            req.getSession().setAttribute(Constants.USER_SESSION,user);
            //     
            resp.sendRedirect(req.getContextPath()+"/main/success.jsp");
        }else{
            //       ,     ,         
            req.setAttribute(Constants.MESSAGE,"         ");
            req.getRequestDispatcher("/login/login.jsp").forward(req,resp);
        }
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}

登録LoginService


    login
    com.qiu.servlet.user.LoginServlet


    login
    /login.do


userパッケージの下にUserServiceletクラスを作成してパスワード変更要求を処理
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class UserServlet extends HttpServlet {
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // Session    username
        Object obj = req.getSession().getAttribute(Constants.USER_SESSION);
        String newpassword = req.getParameter("newpassword");
        boolean flag = true;
        if(obj!=null && !StringUtils.isNullOrEmpty(newpassword)){
            UserService userService = new UserServiceImpl();
            flag = userService.updatePwd(((User)obj).getUsername(),newpassword);
            if(flag){
                req.setAttribute(Constants.MESSAGE,"      ,       ");
                req.getSession().removeAttribute(Constants.USER_SESSION);
            }else{
                req.setAttribute(Constants.MESSAGE,"      ");
            }
        }else{
            req.setAttribute(Constants.MESSAGE,"       ");
        }
        req.getRequestDispatcher("/main/updatePwd.jsp").forward(req,resp);
    }

    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}

UserServiceletの登録


    UserServlet
    com.qiu.servlet.user.UserServlet


    UserServlet
    /main/user.do



共通ツールクラスの作成
utilパッケージを作成し、共通変数ツールクラスConstantsを作成します.
以降の定数はツールクラスの下に置く
public class Constants {
    public final static String USER_SESSION = "userSession";
    public final static String MESSAGE = "message";
}

ログアウト機能の作成
アイデア:セッションを削除し、ログインページにリダイレクト
servletパッケージ内のuserパッケージ内でLogoutServiceクラスを確立する
public class LogoutServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //     Constants.USER_SESSION
        req.getSession().removeAttribute(Constants.USER_SESSION);
        resp.sendRedirect(req.getContextPath()+"/login/login.jsp");//      
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}

サーブレットの登録


    logout
    com.qiu.servlet.user.LogoutServlet


    logout
    /logout.do


jspの下にlogoutを適用する.do,aラベルを例に



">  

ログインブロックの最適化
思想:ページを要求する時、セッションが存在するかどうかを判断する
filterパッケージの下にログインフィルタSysFilterを作成する
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class SysFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {}

    @Override
    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException {
        HttpServletRequest request = (HttpServletRequest) req;
        HttpServletResponse response = (HttpServletResponse) resp;
        //   , Session     
        User user = (User) request.getSession().getAttribute(Constants.USER_SESSION);
        if(user==null){ //         ,     
            response.sendRedirect(request.getContextPath()+"/login/login.jsp");
        }else {
            chain.doFilter(req, resp);
        }
    }

    @Override
    public void destroy() {}
}

フィルタの登録


    SysFilter
    com.qiu.filter.SysFilter


    SysFilter
    /main/*


UserServicelet最適化の詳細
  • パスワードを検証ajaxを使用してタイムリーに動的に最適化
  • サーブレット多重化を実現
  • 使用前にfastjson依存を導入
  • import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.io.IOException;
    import java.io.PrintWriter;
    import java.util.HashMap;
    import java.util.Map;
    
    //  Servlet  
    public class UserServlet extends HttpServlet {
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            String method = req.getParameter("method");
            if(method!=null && method.equals("savepwd")){
                this.updataPwd(req,resp);
            }else if(method!=null && method.equals("pwdmodify")){
                this.pwdModify(req,resp);
            }
        }
    
        protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            doGet(req, resp);
        }
    
        //    
        public void updataPwd(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            // Session    username
            Object obj = req.getSession().getAttribute(Constants.USER_SESSION);
            String newpassword = req.getParameter("newpassword");
            boolean flag;
            if(obj!=null && !StringUtils.isNullOrEmpty(newpassword)){
                UserService userService = new UserServiceImpl();
                flag = userService.updatePwd(((User)obj).getUsername(),newpassword);
                if(flag){
                    req.setAttribute(Constants.MESSAGE,"      ,       ");
                    req.getSession().removeAttribute(Constants.USER_SESSION);
                }else{
                    req.setAttribute(Constants.MESSAGE,"      ");
                }
            }else{
                req.setAttribute(Constants.MESSAGE,"       ");
            }
            req.getRequestDispatcher("/main/updatePwd.jsp").forward(req,resp);
        }
    
        //     ,session       
        public void pwdModify(HttpServletRequest req, HttpServletResponse resp) throws IOException {
            Object obj = req.getSession().getAttribute(Constants.USER_SESSION);
            String oldpassword = req.getParameter("oldpassword");
    
            //   Map:   
            Map resultMap = new HashMap();
            if(obj==null){//session     
                resultMap.put("result","sessionError");
            }else if(StringUtils.isNullOrEmpty(oldpassword)){   //       
                resultMap.put("result","error");
            }else{
                String userPassword = ((User)obj).getPassword();
                if(oldpassword.equals(userPassword)){
                    resultMap.put("result","true");
                }else{
                    resultMap.put("result","false");
                }
            }
            resp.setContentType("application/json");
            PrintWriter writer = resp.getWriter();
            //JSONArray      JSON   ,    
            writer.write(JSONArray.toJSONString(resultMap));
            writer.flush();
            writer.checkError();
        }
    }
    
    

    updatePwd.jspファイルは、環境に応じて異なる修正を行います
    
    
    
        
            
        
        
        
    
    
    
    ${message}
    let oldpassword = null; let newpassword = null; let rnewpassword = null; let saveBtn = null; let message = null; let path = "${pageContext.request.contextPath}"; $(function () { oldpassword = $("#oldpassword"); newpassword = $("#newpassword"); rnewpassword = $("#rnewpassword"); saveBtn = $("#save"); message = $("#message"); oldpassword.on("focus",function (){ message.html(" !"); }).on("blur",function () { $.ajax({ type:"GET", url:path+"/main/user.do", data:{method:"pwdmodify",oldpassword:oldpassword.val()}, // path+"/main/user.do?method=pwdmodify&oldpassword=oldpassword.val()" dataType:"json", success:function (data) { if(data.result === "true"){ // message.html(" !"); }else if(data.result ==="false"){ message.html(" !"); }else if(data.result ==="sessionError"){ message.html(" session , !"); }else if(data.result ==="error"){ message.html(" !"); } }, error:function (data) { // message.html(" !"); } }); }); // newpassword.on("focus",function () { message.html(" 6 20 !"); }).on("blur",function () { if(newpassword.val()!=null && newpassword.val().length>=6 && newpassword.val().length<20){ message.html(" !"); }else{ message.html(" , "); } }); // rnewpassword.on("focus",function () { message.html(" "); }).on("blur",function () { if(newpassword.val()!=null && newpassword.val().length>=6 && newpassword.val().length<20 && newpassword.val() === rnewpassword.val()){ message.html(" !"); }else{ message.html(" , !"); } }); }); function send(){ if(message.html()===" , " || (oldpassword.val().length!==0 && newpassword.val().length!==0 && rnewpassword.val().length!==0)){ document.getElementsByClassName("update-form")[0].submit(); }else{ message.html(" , !"); } }

    補足内容
  • ウェルカムページとセッションの有効期限の設定
  • 
    
        /login/login.jsp
    
    
    
        30
    
    
  • fastjson依存
  • 
    
        com.alibaba
        fastjson
        1.2.62
    
    
  • パケット化状況:pojoパケット、daoパケット、userパケット、serviceパケット、servletパケット、filterパケット、utilパケット