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