Idées d'architecture de servlet (MVC)

Depuis quelques jours, je travaille sur un projet qui sépare le front et le back end. Le modèle MVC est adopté. Les tutoriels sur le MVC en ligne sont désorganisés et n'ont pas été écrits en détail, j'ai donc écrit cet article. Ce article est un article de partage à partager que j'apprends. Les problèmes rencontrés dans et quelques astuces qui me semblent utiles.

Table des matières

structure du répertoire

fichier de configuration

Couche Dao

Couche de services

Couche de contrôle

Couche modèle

paquet d'importation lib

configuration web.xml


structure du répertoire

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

fichier de configuration

jdbc.properties : Les quatre paramètres (pilote, URL, nom d'utilisateur, mot de passe) utilisés pour obtenir la connexion lors du développement sont généralement stockés dans le fichier de configuration, ce qui est pratique pour une maintenance ultérieure. Si le programme doit remplacer la base de données, seul le le fichier de configuration doit être modifié.

version oracle

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

version 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

Il stocke certains fichiers de configuration pour la connexion à la base de données, ce qui peut réduire la quantité de code

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();
                }
            }
        }
    }


}

Couche Dao

Le dao stocke certains codes qui fonctionnent sur la base de données

IUserDao.java stocke les interfaces de certains codes qui fonctionnent sur 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);
}

Inside UserDao.java est le code qui implémente IUserDao.java pour fonctionner sur DB

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;
    }
}

Il existe des opérations telles que l'ajout, la suppression, la modification et la vérification de la base de données.

Couche de services

IUserService.java stocke les interfaces qui implémentent 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);

}

Ce qui est stocké dans UserService.java consiste à implémenter les méthodes dans l'interface IUserService.java, à déclarer un membre de Dao, puis à utiliser le membre de Dao pour appeler la méthode dans 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);
    }
}

Couche de contrôle

Le servlet est stocké dans le contrôle, qui interagit avec l'interface (vue) et le service.

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("哈哈");
        

    }

}

L'initialisation du cycle de vie du servlet ne sera exécutée qu'une seule fois et les objets de la couche de service ne sont généralement déclarés qu'une seule fois. Une fois le projet transféré dans le cloud, si des milliers de personnes visitent votre page Web, il est très inutile de créer un service une seule fois. Ainsi, afin de réduire l'utilisation de la mémoire, placez Service dans init.

Couche modèle

Il stocke les classes d'entités, les méthodes getter et setter pour les membres, les constructeurs avec des paramètres et aucun paramètre, et des méthodes telles que le remplacement de 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 +
                '}';
    }
}

Ou vous pouvez utiliser lombok.jar sans écrire les méthodes getter et setter, les constructeurs avec paramètres et sans paramètres, réécrire toString et d'autres méthodes.

@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;

}

paquet d'importation lib

lib stocke certains packages .jar importés.

xxx.jsp

Inutile de dire qu'une chose à noter est que l'emplacement de l'action from correspond à votre fichier web.xml.

configuration web.xml

Le fichier web.xml est utilisé pour initialiser les informations de configuration : telles que la page d'accueil, le servlet, le mappage de servlet, le filtre, l'écouteur, le niveau de chargement au démarrage, etc. Chaque fichier xml possède un fichier Schema qui définit ses règles d'écriture, c'est-à-dire combien d'éléments tag sont définis dans le fichier xml Schema correspondant à la définition web.xml de javaEE, les éléments tag définis par celui-ci peuvent apparaître dans web. xml , qui ont des fonctions spécifiques.

    <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>

 mappage de servlet

Le processus de mappage des ports de mappage de servlets est le suivant : votre maison se trouve dans la salle 2410, bâtiment B, dans une communauté. Votre ami vient vers vous et trouve la porte de la communauté. Il ne sait pas à quel étage et numéro vous habitez ? Il suffit de demander à l'agent de sécurité à la porte, et l'agent de sécurité vous le dit très poliment, il a détaillé le numéro de maison de votre maison, afin que vos amis puissent facilement trouver votre maison.

url-pattern

En fait, url-pattern est le modèle d'url, c'est-à-dire que le conteneur trouve un servlet spécifique à exécuter selon ce modèle lors de la recherche.

nom_servlet

Le programme de servlet a un alias, généralement un nom de classe, pour indiquer au serveur pour quel programme de servlet l'adresse actuellement configurée est utilisée.

classe servlet

La classe qui demande le transfert dans le développement Web Java est l'adresse de votre classe sous votre package.

 Si tu n'accumules pas quelques pas, tu ne peux pas faire mille kilomètres, tant que tu es jeune, travaille dur et donne une explication à ton futur moi ! Aller de l'avant vers un meilleur soi demain!

Je suppose que tu aimes

Origine blog.csdn.net/aasd23/article/details/126375547
conseillé
Classement