Ideas de arquitectura de servlet (MVC)

En los últimos días, he estado trabajando en un proyecto que separa los extremos delantero y trasero. Se adopta el modelo MVC. Los tutoriales sobre MVC en línea están desorganizados y no se han escrito en detalle, así que escribí este artículo. Esto El artículo es un artículo para compartir que estoy aprendiendo. Los problemas encontrados y algunos consejos que creo que son útiles.

Tabla de contenido

estructura de directorios

archivo de configuración

capa dao

capa de servicio

Capa de control

Capa de modelo

paquete de importación lib

configuración web.xml


estructura de directorios

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

archivo de configuración

jdbc.properties: Los cuatro parámetros (controlador, URL, nombre de usuario, contraseña) utilizados para obtener la conexión durante el desarrollo generalmente se almacenan en el archivo de configuración, lo cual es conveniente para el mantenimiento posterior. Si el programa necesita reemplazar la base de datos, solo el el archivo de configuración necesita ser modificado.

versión del oráculo

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

versión 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

Almacena algunos archivos de configuración para conectarse a DB, lo que puede reducir la cantidad de código

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


}

capa dao

El dao almacena algunos códigos que operan en la base de datos.

IUserDao.java almacena las interfaces de algunos códigos que operan en 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);
}

Dentro de UserDao.java está el código que implementa IUserDao.java para operar en 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;
    }
}

Hay operaciones como agregar, borrar, modificar y verificar la base de datos.

capa de servicio

IUserService.java almacena las interfaces que implementan 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);

}

Lo que se almacena en UserService.java es implementar los métodos en la interfaz IUserService.java, declarar un miembro de Dao y luego usar el miembro de Dao para llamar al método en 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);
    }
}

Capa de control

El Servlet se almacena en el control, que interactúa con la interfaz (vista) y el servicio.

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

    }

}

El ciclo de vida del servlet init solo se ejecutará una vez, y los objetos en la capa de servicio generalmente se declaran solo una vez.Después de que el proyecto va a la nube, si miles de personas visitan su página web, es un gran desperdicio crear un servicio una vez ejecutado Entonces, para reducir el uso de memoria, coloque Service en init.

Capa de modelo

Almacena clases de entidad, métodos getter y setter para miembros, constructores con parámetros y sin parámetros, y métodos como anular 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 +
                '}';
    }
}

O puede usar lombok.jar sin escribir métodos getter y setter, constructores con parámetros y sin parámetros, reescribir toString y otros métodos.

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

}

paquete de importación lib

lib almacena algunos paquetes .jar importados.

xxx.jsp

No hace falta decir que una cosa a tener en cuenta es que la ubicación de la acción from corresponde a su archivo web.xml.

configuración web.xml

El archivo web.xml se utiliza para inicializar la información de configuración: como la página de bienvenida, el servlet, la asignación de servlet, el filtro, el oyente, el nivel de carga de inicio, etc. Cada archivo xml tiene un archivo Schema que define sus reglas de escritura, es decir, cuantos elementos de etiqueta están definidos en el archivo de Schema xml correspondiente a la definición web.xml de javaEE, los elementos de etiqueta definidos por él pueden aparecer en web. xml, que tienen funciones específicas.

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

 mapeo de servlet

El proceso de mapeo de puertos de mapeo de servlet es como: tu casa está en la habitación 2410, edificio B, en una comunidad. Tu amigo viene a ti y encuentra la puerta de la comunidad. ¿Él no sabe en qué piso y número vives? Simplemente pregunte al guardia de seguridad en la puerta, y el guardia de seguridad le dice muy cortésmente. Detalló el número de casa de su casa, para que sus amigos puedan encontrarla fácilmente.

patrón de URL

De hecho, url-pattern es el patrón de url, es decir, el contenedor encuentra un servlet específico para ejecutar de acuerdo con este patrón al buscar.

nombre-servlet

El programa servlet tiene un alias, generalmente un nombre de clase, para decirle al servidor para qué programa servlet se usa la dirección configurada actualmente.

clase de servlet

La clase que solicita el reenvío en el desarrollo web de Java es la dirección de su clase en su paquete.

 ¡Si no acumulas unos pocos pasos, no puedes recorrer mil millas, mientras eres joven, trabaja duro y dale una explicación a tu futuro yo! ¡Avance hacia un mejor yo mañana!

Supongo que te gusta

Origin blog.csdn.net/aasd23/article/details/126375547
Recomendado
Clasificación