1.准备工作
1.创建一个基于Maven的javaWeb项目
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-slmdmTXx-1587820421698)(…/img/image-20200331215336886.png)]
2.配置Tomcat
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ma9zre2V-1587820421700)(…/img/image-20200331215407416.png)]
###3.测试项目能否跑起来(即项目能否正常启动)
###4.配置相关的maven依赖,即导入相关的jar包
<!-- servlet依赖 -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
</dependency>
<!-- jsp依赖 -->
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>javax.servlet.jsp-api</artifactId>
<version>2.3.3</version>
<scope>provided</scope>
</dependency>
<!--连接数据库-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
</dependency>
<!-- JSTL表达式依赖 -->
<dependency>
<groupId>javax.servlet.jsp.jstl</groupId>
<artifactId>jstl-api</artifactId>
<version>1.2</version>
</dependency>
<!-- standard标签库 -->
<dependency>
<groupId>taglibs</groupId>
<artifactId>standard</artifactId>
<version>1.1.2</version>
</dependency>
5.创建项目包结构
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Xw8ks6zT-1587820421704)(…/img/image-20200331215648253.png)]
dao:对数据库进行操作
filter:过滤类
pojo:实体类
serviceL:服务层,接收到请求后,交给dao层处处理
servlet:对用户的请求进行处理,合法的交给service层处理
util:工具类
6.编写实体类
根据创建的数据库表,编写相应的实体类
ORM映射:表-类映射
对象关系映射(Object Relational Mapping,简称ORM)模式是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术。简单的说,ORM是通过使用描述对象和数据库之间映射 的元数据,将程序中的对象自动持久化到关系数据库中
BigDecimal:float和double类型的主要设计目标是为了科学计算和工程计算。他们执行二进制浮点运算,这是为了在广域数值范围上提供较为精确的快速近似计算而精心设计的。然而,它们没有提供完全精确的结果,所以不应该被用于要求精确结果的场合。但是,商业计算往往要求结果精确,这时候BigDecimal就派上大用场啦。
###7.编写基础公共类
-
数据库配置文件
driver=com.mysql.jdbc.Driver url=jdbc:mysql://localhost:3306?useUnicode=true&characterEncoding=utf-8&useSSL=false username=root password=123456
-
编写基础dao类
对于下面代码中的String sql, Object[] params
params数组中存储的是sql语句中的具体值
因为sql语句要预编译,所以传递一个?号代替
package com.nslt.dao; import java.io.IOException; import java.io.InputStream; import java.sql.*; import java.util.Properties; //操作数据库的公共类 public class BaseDao { private static String driver; private static String url; private static String username; private static String password; //静态代码块,类加载的时候就进行初始化 static { Properties properties = new Properties();//主要用于读取Java的配置文件 InputStream is = BaseDao.class.getClassLoader().getResourceAsStream("db.properties"); try { properties.load(is); } catch (IOException e) { e.printStackTrace(); } driver = properties.getProperty("driver"); url = properties.getProperty("url"); username = properties.getProperty("username"); password = properties.getProperty("password"); } //获取数据库的连接 public static Connection getConnection() { Connection connection = null; try { Class.forName(driver); connection = DriverManager.getConnection(url, username, password); } catch (Exception e) { e.printStackTrace(); } return connection; } //编写查询公共方法 public static ResultSet excute(Connection connection, PreparedStatement preparedStatement, ResultSet resultSet, String sql, Object[] params) throws SQLException { preparedStatement = connection.prepareStatement(sql); for (int i = 0; i < params.length; i++) { //setObject,占位符从1开始,但是数组从0开始 preparedStatement.setObject(i + 1, params[i]); } resultSet = preparedStatement.executeQuery(); return resultSet; } //编写增删改公共方法 public static int excute(Connection connection, String sql, Object[] params, PreparedStatement preparedStatement) throws SQLException { preparedStatement = connection.prepareStatement(sql); for (int i = 0; i < params.length; i++) { //setObject,占位符从1开始,但是数组从0开始 preparedStatement.setObject(i + 1, params[i]); } int updateRows = preparedStatement.executeUpdate(); return updateRows; } //释放资源 public static boolean closeResource(Connection connection, PreparedStatement preparedStatement, ResultSet resultSet) { boolean flag = true; if (resultSet != null) { try { resultSet.close(); //GC回收 resultSet = null; } catch (SQLException e) { e.printStackTrace(); flag = false; } } if (preparedStatement != null) { try { preparedStatement.close(); //GC回收 preparedStatement = null; } catch (SQLException e) { e.printStackTrace(); flag = false; } } if (connection != null) { try { connection.close(); //GC回收 connection = null; } catch (SQLException e) { e.printStackTrace(); flag = false; } } return flag; } }
Properties:Java中有个比较重要的类Properties(Java.util.Properties),主要用于读取Java的配置文件,各种语言都有自己所支持的配置文件,配置文件中很多变量是经常改变的,这样做也是为了方便用户,让用户能够脱离程序本身去修改相关的变量设置
-
编写字符编码过滤器
package com.nslt.filter; import javax.servlet.*; import java.io.IOException; public class CharacterEncodingFilter implements Filter { public void init(FilterConfig filterConfig) throws ServletException { } public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { servletRequest.setCharacterEncoding("utf-8"); servletResponse.setCharacterEncoding("utf-8"); filterChain.doFilter(servletRequest,servletResponse); } public void destroy() { } }
<!-- 字符编码过滤--> <filter> <filter-name>CharacterEncodingFilter</filter-name> <filter-class>com.nslt.filter.CharacterEncodingFilter</filter-class> </filter> <filter-mapping> <filter-name>CharacterEncodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
8.导入静态资源
即自己提前设计好的前端页面
2.登录流程实现
###1.编写前端登录页面
2.设置首页,把tomcat默认打开页面设置为登录页
在web.xml中设置
<!-- 设置欢迎页面-->
<welcome-file-list>
<welcome-file>login.jsp</welcome-file>
</welcome-file-list>
3. 编写dao层登录用户登录的接口
在dao层新建一个user包,里面保存和用户有关的接口和接口的实现类
package com.nslt.dao.user;
import com.nslt.pojo.User;
import java.sql.Connection;
import java.sql.SQLException;
public interface UserDao {
//得到要登录的用户
public User getLoginUser(Connection connection,String userCode) throws SQLException;
}
4. 编写dao接口的实现类
在user目录下,建立UserDao的实现类UserDaoImpl
这个实现类调用BaseDao里面写好的增删改查操作
例如登录操作中,根据用户名来查找数据库中相应的数据,查询结束后,返回一个结果集,里面包含用户的所有数据,把这些数据通过实体类的set方法,赋值给对应的变量中,操作结束后,释放资源
ResultSet有游标的概念,开始时游标指向第一行之前的位置,第一次调用next方法将第一行变为当前行,第二次调用将第二行变为当前行,以此类推。有了当前行的概念,则当没有行时返回false,当前行有效则返回true。
package com.nslt.dao.user;
import com.nslt.dao.BaseDao;
import com.nslt.pojo.User;
import java.sql.Connection;
import java