サーブレット アーキテクチャのアイデア (MVC)

ここ数日、フロントエンドとバックエンドを分離するプロジェクトに取り組んでいます.MVCモデルが採用されています.MVCオンラインのチュートリアルはまとまりがなく、詳細に書かれていないので、この記事を書きました.記事は、私が学んでいることを共有するための共有記事です. で遭遇した問題と、私が役立つと思ういくつかのヒント.

目次

ディレクトリ構造

構成ファイル

ダオレイヤー

サービス層

制御層

モデル層

libインポートパッケージ

web.xml 構成


ディレクトリ構造

config
    jdbc.properties
src
    com.xxx
        user(一般与项目名挂钩)
            control
                UserServlet.java
            dao
                impl
                    UserDao.java
            IUserDao.java
            model
                User.java
            service
                impl
                    UserService.java
            IUserService.java
        util
            JdbcUtil.java
web
    web-inf
        web.xml
        lib
            xxx.jar
    xxx.jsp

構成ファイル

jdbc.properties : 開発中に接続を取得するために使用される 4 つのパラメーター (ドライバー、URL、ユーザー名、パスワード) は、通常、構成ファイルに保存されます。構成ファイルを変更する必要があります。

オラクル版

username=itxzw
password=123456
driver=oracle.jdbc.OracleDriver
url=jdbc:oracle:thin:@localhost:1521:orcl

mysql バージョン

driver=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/db1?serverTimezone=Hongkong&useUnicode=true&characterEncoding=utf8&useSSL=false


或
url=jdbc:mysql://localhost/db1?useSSL=false&CharacterEncoding=UTF-8&server=TUC
user=root
password=123456

JdbcUtil.java

DB に接続するための構成ファイルがいくつか保存されているため、コードの量を減らすことができます。

public class JdbcUtil {
    public static String username;
    public static String password;
    public static String driver;
    public static String url;

    static {
        // -1.读取配置文件
        InputStream is = JdbcUtil.class.getClassLoader().getResourceAsStream("jdbc.properties");
        Properties pro = new Properties();
        try {
            pro.load(is);
            username = pro.getProperty("username");
            password = pro.getProperty("password");
            driver = pro.getProperty("driver");
            url = pro.getProperty("url");

            // 0.加载驱动
            Class.forName(driver);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static Connection getConnection(){
        // 1.连接数据库
        Connection conn = null;
        try {
            conn = DriverManager.getConnection(url, username, password);
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }
        return conn;
    }

    public static void close(ResultSet rs, Statement stmt,Connection conn){
        // 5.关闭连接
        try {
            if(rs!=null){
                rs.close();
            }
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }finally {
            try {
                if (stmt!=null){
                    stmt.close();
                }
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }finally {

                try {
                    if (conn!=null){
                        conn.close();
                    }
                } catch (SQLException throwables) {
                    throwables.printStackTrace();
                }
            }
        }
    }


}

ダオレイヤー

dao には、DB 上で動作するいくつかのコードが格納されます

IUserDao.java には、DB で動作する一部のコードのインターフェイスが格納されます

public interface IUserDao {

    // 添加用户
    public boolean add(User user);

    // 查询
    public User query(User user);

    // 根据名字查询
    public User queryUserByName(String name);


    // 根据ID_NUMBER查
    public User queryUserByNumber(String number);
}

UserDao.java の中には、DB を操作する IUserDao.java を実装するコードがあります。

public class UserDao implements IUserDao {
    @Override
    public boolean add(User user) {

        …………
        return user;
    }

    @Override
    public User query(User user) {
        Connection conn = null;
        PreparedStatement stmt = null;
        ResultSet rs = null;
        User loginuser = null;
        try {
            // 1.连接数据库
            conn = JdbcUtil.getConnection();
            // 2.获取Statement对象:将sql语句传给数据库服务器执行
            String sql = "select * from T_USER where USERNAME = ? and PASSWORD = ?";
            stmt = conn.prepareStatement(sql);
            // 2.5.注入参数
            stmt.setString(1,user.getUsername());
            stmt.setString(2,user.getPassword());

            // 3.执行sql,获取返回结果
            rs = stmt.executeQuery();

            // 4.处理结果集

            if(rs.next()){
                Integer id = rs.getBigDecimal("id")==null?null:rs.getBigDecimal("id").intValue();
                String un = rs.getString("username");
                String password = rs.getString("password");
                Integer sex = rs.getString("sex")==null?null:rs.getBigDecimal("sex").intValue();
                String idNumber = rs.getString("ID_NUMBER");
                String tel = rs.getString("tel");
                String addr = rs.getString("addr");
                Integer type = rs.getString("type")==null?null:rs.getBigDecimal("type").intValue();
                loginuser = new User(id,un,password,sex,idNumber,tel,addr,type);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            JdbcUtil.close(rs,stmt,conn);
        }
        return loginuser;
    }

    @Override
    public User queryUserByName(String name) {

        …………
        return user;
    }

    @Override
    public User queryUserByNumber(String number) {

        …………
        return user;
    }
}

DBの追加、削除、変更、確認などの操作があります。

サービス層

IUserService.java は、UserService.java を実装するインターフェースを格納します。

public interface IUserService {

    // 添加用户
    public boolean register(User user);

    // 登录
    public User login(User user);

    // 根据名字查询
    public User queryUserByName(String name);


    // 根据ID_NUMBER查
    public User queryUserByNumber(String number);

}

UserService.java に格納されているのは、IUserService.java インターフェイスにメソッドを実装し、Dao のメンバーを宣言し、Dao のメンバーを使用して Dao 内のメソッドを呼び出すことです。

public class UserService implements IUserService {

    private UserDao userDao;

    public void setUserDao(UserDao userDao) {
        this.userDao = userDao;
    }
    public UserDao getUserDao() {
        return userDao;
    }


    @Override
    public boolean register(User user) {
        User user1 = userDao.queryUserByName(user.getUsername());
        if (user1!=null) return false;
        User user2 = userDao.queryUserByNumber(user.getIdNumber());
        if (user2!=null) return false;
        return userDao.add(user);
    }

    @Override
    public User login(User user) {
        return userDao.query(user);
    }

    @Override
    public User queryUserByName(String name) {
        return userDao.queryUserByName(name);
    }

    @Override
    public User queryUserByNumber(String number) {
        return userDao.queryUserByNumber(number);
    }
}

制御層

サーブレットは、インターフェイス (ビュー) およびサービスと対話するコントロールに格納されます。

public class UserServlet extends HttpServlet {
    private UserService userService;

    @Override
    public void init() throws ServletException {
        userService = new UserService();
        UserDao userDao = new UserDao();
        userService.setUserDao(userDao);
    }

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

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        request.setCharacterEncoding("UTF-8");

        String action = request.getParameter("action");
        if("LOGIN".equalsIgnoreCase(action)){
            login(request,response);
        }else if ("REGISTER".equalsIgnoreCase(action)){
            register(request,response);
        }else{
            response.sendRedirect("/a1/day02/fade.jsp");
        }
    }

    public void login(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException{
        String username = request.getParameter("username");
        String password = request.getParameter("password");
        User u = new User();
        u.setUsername(username);
        u.setPassword(password);

        User loginuser = userService.login(u);
        if(loginuser!=null){
            response.sendRedirect("/a1/day02/success.jsp");
        }else{
            response.sendRedirect("/a1/day02/login.jsp");
        }

    }

    public void register(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException{


        String[] hobbys = request.getParameterValues("hobby");
        String un = request.getParameter("username");
        String password = request.getParameter("password");
        String usersex = request.getParameter("sex");
        Integer sex = usersex==null?null:Integer.parseInt(usersex);
        String idNumber = request.getParameter("id_number");
        String tel = request.getParameter("tel");
        String addr = request.getParameter("addr");

        String usertype = request.getParameter("type");
        Integer type = usertype==null?null:Integer.parseInt(usertype);


        response.setContentType("text/html;charset=UTF-8");
        response.getWriter().println("哈哈");
        

    }

}

サーブレット ライフ サイクルの init は 1 回だけ実行され、サービス層のオブジェクトは通常 1 回だけ宣言されます. プロジェクトがクラウドに移行した後、何千人もの人々が Web ページにアクセスした場合、一度サービスを作成するのは非常に無駄です.そのため、メモリ使用量を減らすために、Service を init に入れます。

モデル層

エンティティ クラス、メンバーの getter メソッドと setter メソッド、パラメーター付きのコンストラクターとパラメーターなしのコンストラクター、および toString のオーバーライドなどのメソッドを格納します。

public class User {

    private int id;
    private String username;
    private String password;
    private int sex;
    private String id_number;
    private String tel;
    private String addr;
    private int type;

    public User() {
    }

    public User(int id, String username, String password, int sex, String id_number, String tel, String addr, int type) {
        this.id = id;
        this.username = username;
        this.password = password;
        this.sex = sex;
        this.id_number = id_number;
        this.tel = tel;
        this.addr = addr;
        this.type = type;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public int getSex() {
        return sex;
    }

    public void setSex(int sex) {
        this.sex = sex;
    }

    public String getId_number() {
        return id_number;
    }

    public void setId_number(String id_number) {
        this.id_number = id_number;
    }

    public String getTel() {
        return tel;
    }

    public void setTel(String tel) {
        this.tel = tel;
    }

    public String getAddr() {
        return addr;
    }

    public void setAddr(String addr) {
        this.addr = addr;
    }

    public int getType() {
        return type;
    }

    public void setType(int type) {
        this.type = type;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", username='" + username + '\'' +
                ", password='" + password + '\'' +
                ", sex=" + sex +
                ", id_number='" + id_number + '\'' +
                ", tel='" + tel + '\'' +
                ", addr='" + addr + '\'' +
                ", type=" + type +
                '}';
    }
}

または、getter および setter メソッド、パラメーター付きのコンストラクターとパラメーターなしのコンストラクター、toString およびその他のメソッドの書き換えを行わずに、lombok.jar を使用できます。

@Data
@AllArgsConstructor
@NoArgsConstructor
@ToString
public class User {

  private Integer id;
  private String username;
  private String password;
  private Integer sex;
  private String idNumber;
  private String tel;
  private String addr;
  private Integer type;

}

libインポートパッケージ

lib には、インポートされた .jar パッケージがいくつか保存されます。

xxx.jsp

言うまでもなく、from アクションの場所が web.xml ファイルに対応していることに注意してください。

web.xml 構成

web.xml ファイルは、ウェルカム ページ、サーブレット、サーブレット マッピング、フィルター、リスナー、起動時の読み込みレベルなどの構成情報を初期化するために使用されます。各 xml ファイルには、その記述規則、つまり javaEE の定義 web.xml に対応する xml スキーマ ファイル内に定義されているタグ要素がいくつ定義されているか、それによって定義されたタグ要素が web に出現できるかどうかを定義するスキーマ ファイルがあります。 xml 、特定の機能があります。

    <servlet>
        <servlet-name>UserServlet</servlet-name>
        <servlet-class>com.itxzw.user.control.UserServlet</servlet-class>
    </servlet>

    <servlet-mapping>
        <servlet-name>UserServlet</servlet-name>
        <url-pattern>/userServlet</url-pattern>
    </servlet-mapping>

 サーブレットマッピング

サーブレット マッピング ポート マッピングのプロセスは次のようなものです: あなたの家はコミュニティの B 棟の 2410 号室にあります. あなたの友人があなたのところに来て、コミュニティのゲートを見つけました. 彼はあなたが住んでいる階と番号を知りません?ゲートの警備員に尋ねると、警備員は非常に丁寧に教えてくれます. 彼はあなたの家の番地を詳しく教えてくれたので、友達はあなたの家を簡単に見つけることができます.

URL パターン

実際、url-pattern は URL パターンです。つまり、コンテナーは、検索時にこのパターンに従って実行する特定のサーブレットを見つけます。

サーブレット名

サーブレット プログラムにはエイリアス (通常はクラス名) があり、現在構成されているアドレスがどのサーブレット プログラムに使用されているかをサーバーに伝えます。

サーブレットクラス

Java Web 開発で転送を要求するクラスは、パッケージの下のクラスのアドレスです。

 数歩積まないと千里行けない、若いうちに頑張って未来の自分に説明を!明日はより良い自分へと進みましょう!

おすすめ

転載: blog.csdn.net/aasd23/article/details/126375547
おすすめ