zoukankan      html  css  js  c++  java
  • 简单JavaWeb工程创建

    项目目录简介

    创建数据库连接工具

    db.properties

    将数据库连接配置写在本文件中,当配置发生变化时,仅需修改本文件内容即可

    ConnectionUtil

    这个类中总共写了三个方法

    1. 静态方法 读取properties文件中的配置,此处仅是读取,并不创建数据库连接
    static {
    		//类加载器读取文件
    		try {
    			InputStream in = ConnectionUtil.class.getClassLoader().getResourceAsStream("db.properties");
    			props.load(in);
    			driver = props.getProperty("jdbc.driver");
    			url = props.getProperty("jdbc.url");
    			username = props.getProperty("jdbc.username");
    			password = props.getProperty("jdbc.password");
    			Class.forName(driver);
    		} catch (Exception e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    		
    	}
    
    1. 静态方法 返回数据库连接 外部方法可以调用这个方法获取数据库连接
    /**
    	 * 获取连接的方法
    	 */
    	public static Connection getConn() throws Exception{
    		Connection conn = DriverManager.getConnection(url, username, password);
    		return conn;
    	}
    
    1. 静态方法 关闭数据库连接
    	/**
    	 * 关闭连接的方法
    	 */
    	
    	public static void closeConn(Connection conn) {
    		if (conn != null) {
    			try {
    				conn.close();
    			} catch (SQLException e) {
    				e.printStackTrace();
    			}
    		}
    	}
    

    实体类的创建

    实体是与数据库对应的实体,变量命名与数据类型与数据库尽量保持一致

    package com.sx.beans;
    
    public class User {
        private String loginName;
        private String password;
        private String sex;
        private String address;
        public String getLoginName() {
            return loginName;
        }
        public void setLoginName(String loginName) {
            this.loginName = loginName;
        }
        public String getPassword() {
            return password;
        }
        public void setPassword(String password) {
            this.password = password;
        }
        public String getSex() {
            return sex;
        }
        public void setSex(String sex) {
            this.sex = sex;
        }
        public String getAddress() {
            return address;
        }
        public void setAddress(String address) {
            this.address = address;
        }
        public User() {
        }
        public User(String loginName, String password, String sex, String address) {
            this.loginName = loginName;
            this.password = password;
            this.sex = sex;
            this.address = address;
        }
        @Override
        public String toString() {
            return "User [loginName=" + loginName + ", password=" + password + ", sex=" + sex + ", address=" + address
                    + "]";
        }
        
    }
    

    eclipse和idea中都由对实体类创建的快捷方式

    在User.java中单击右键 找到Source ,单击这两处可以快速生成get set方法和构造方法

    Dao创建

    Dao层又为Data access object,将与数据库的交互分别写在对应的接口与实现类中

    User与数据库的交互操作 本文仅以checkPassword :检验用户登录密码是否正确为例。

    userDao接口

    在这个接口中定义与数据库交互完成的功能,这里检查用户登录,传入参数密码和账号,通过数据库查询返回User。这里采用先创建接口再创建实现类的方式,为什么要多此一举呢?这种设计模式满足低耦合,高内聚的设计理念,功能之间互不干扰,而且在团队开发中,一个人完成了某个功能的开发,其他人只需要关心功能的实现即可,直接传参调用,而不需要关心内部的实现。

    package com.sx.dao;
    
    import java.util.List;
    
    import com.sx.beans.User;
    
    public interface UserDao {
        public User checkPassword(String username,String password);
        public List<User> findAll();
        public int modUser(User user);
        public int addUser(User user);
    }
    

    userDaoImpl

    实现checkPassword方法,获取数据库链接,通过sql语句查询结果,将查到的信息赋值给创建的User对象,User对象初始为空,如果查询到结果,则User就不为空,我们可以通过判断User 是否为null判断账号和密码是否正确。

    	@Override
    	public User checkPassword(String username, String password) {
    		User u = null;
    		Connection conn = null;
    		try {
    			conn = ConnectionUtil.getConn();
    			String sql = "select loginname,sex,address from t_staff t " + "where t.loginname = ? and password = ?";
    			PreparedStatement pre = conn.prepareStatement(sql);
    			pre.setString(1, username);
    			pre.setString(2, password);
    			ResultSet res = pre.executeQuery();
    			if (res.next()) {
    				u = new User();
    				u.setLoginName(res.getString("loginName"));
    				u.setAddress(res.getString("address"));
    			}
    			return u;
    		} catch (Exception e) {
    			e.printStackTrace();
    		} finally {
    			try {
    				ConnectionUtil.closeConn(conn);
    			} catch (Exception e) {
    				e.printStackTrace();
    			}
    		}
    		return null;
    	}
    

    Service

    为controller提供服务 也是采用写接口,在写实现类的方式

    Service 接口

    public interface UserService {
    	User loginCheck(String username,String password);
    }
    

    ServiceImpl 实现类

    在service层调用dao,以完成对应的功能

    注意这里书写的方式,UserDao userDao = new UserDaoImpl();

    new 后后面跟的是实现类类名,必须通过实现类才能调用对应的方法,变量名一般命名为xxxDao,而实际上它是一个实现类,这种命名方式可读性非常好,单从字面就能知道功能与对应所属的层。

    	@Override
    	public User loginCheck(String username, String password) {
    		UserDao userDao = new UserDaoImpl();
    		User user = userDao.checkPassword(username, password);
    		return user;
    	}
    

    servlet

    servlet 控制着前段访问的路径 前段的请求会转发到这里,servlet根据前端不同的请求,调用不同的service 返回 数据给前端

    每一个servlet对应一个action,这个配置在web.xml中完成,后续会说到。

    servlet 创建

    创建出servlet的时候,会默认为我们创建doget与dopost方法,这两种方法对应着前端不同的请求方式。以登录为例,前端如果采用get方法,在登录时输入了密码,get方法会在地址栏中显示出所传的参数。post方法则只显示请求资源路径,具有较高的安全性,所以采用了doPost方法处理请求。

    首先是获取前端所传过来的参数,然后创建service,调用service获取user对象,通过判断对象是否为空来判断用户名账号和密码是否正确。如果账号存在且密码正确,跳转到listuser界面,如果错误则跳转到error界面

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
       	String username = request.getParameter("username");
       	String password = request.getParameter("password");
       	
       	UserService service = new UserServiceImpl();
       	User user = service.loginCheck(username, password);
       	
       	response.setContentType("text/html;charset=utf-8");
       	if(user != null) {
       		List<User> users = service.findAll();
       		HttpSession session = request.getSession();
       		session.setAttribute("users", users);
       		response.sendRedirect("listuser.jsp");
       	}else {
       		response.sendRedirect("error.jsp");
       	}
       	
       }
    
    

    web.xml 配置

    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
     <display-name>Exercise</display-name>
     <welcome-file-list>
       <welcome-file>login.jsp</welcome-file>
     </welcome-file-list>
     <servlet>
       <servlet-name>Login</servlet-name>
       <servlet-class>com.sx.controller.LoginCheck</servlet-class>
     </servlet>
     <servlet-mapping>
       <servlet-name>Login</servlet-name>
       <url-pattern>/login</url-pattern>
     </servlet-mapping>
    </web-app>
    

    对于创建的servlet,我们要配置servlet与servlet-mapping。

    servlet节点中,有servlet名字与对应的class,可以理解为:为servlet起个名字。servlet-class注意路径书写是否正确,可以通过 按住Ctrl键同时鼠标左键放到路径上,单击可以访问到你的LoginCheck类,说明配置成功。

    servlet-mapping:配置前端请求路径与servlet匹配,注意要加/

     <servlet>
        <servlet-name>Login</servlet-name>
        <servlet-class>com.sx.controller.LoginCheck</servlet-class>
      </servlet>
      <servlet-mapping>
        <servlet-name>Login</servlet-name>
        <url-pattern>/login</url-pattern>
      </servlet-mapping>
    

    以上我们已经实现了后端的全部功能。

    jsp简单说明

    <form action="login" method="Post">
           用户名:<input type="text" placeholder="请输入用户名" name="username" size="20px"><br>
           密码:<input type="password" placeholder="请输入密码" name="password" size="20px"><br>
           <input type="submit" value="提交" size="10px">
           <input type="reset" value="重置" size="10px">
           </form>
    

    form method中指定请求方式为post 对应servlet中使用dopost方法响应请求

    input name属性 username 与password 对应servlet获取参数时的变量名字

    		String username = request.getParameter("username");
    		String password = request.getParameter("password");
    
  • 相关阅读:
    PostgreSQL数据库中的常见错误
    postgresql相关命令
    Linux系统查看公网IP地址
    TCP/IP TIME_WAIT状态原理
    TCP连接状态详解及TIME_WAIT过多的解决方法
    让你提升命令行效率的 Bash 快捷键 [完整版]
    linux 如何显示一个文件的某几行(中间几行)
    linux中内核的一个不错的参数somaxconn
    Linux crontab 实现每秒执行
    Linux tar This does not look like a tar archive
  • 原文地址:https://www.cnblogs.com/wuloucha/p/13375874.html
Copyright © 2011-2022 走看看