javaweb
jsp
jsp概念
jsp: java Server Pages: java服务器端页面,也和Servlet一样,用于动态web技术!
最大的特点:
写jsp就像在写html
区别:jsp页面中可以嵌入java代码,为用户提供动态的数据;
jsp原理:
思路:jsp是怎样执行的?
代码层面没有任何问题
服务器内部工作
tomcat中有一个work目录:
idea中使用tomcat的会在Idea的tomcat中生产一个work目录。
jsp页面变成了一个java程序!
浏览器向服务器发送请求,不管访问什么资源,其实都在访问Servlet!
jsp最终也会被转换成为一个java类
jsp本质就是一个Servlet
在jsp页面中:
只有是java代码就会原封不动的输出:
如果是html代码,就会被转换为
out.write("name")
jsp基础语法
需要导入的依赖 servlet,jsp,jstl,standard标签库
<dependencies>
<!-- Servlet依赖-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
</dependency>
<!-- jsp依赖-->
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>javax.servlet.jsp-api</artifactId>
<version>2.3.3</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>
</dependencies>
说明:任何语言都有自己的语法,java中有,jsp作为java技术的一种应用,他拥有一些自己扩充的语法。
jsp表达式
<%--jsp表达式
作业:用来将程序的输出,输出到客户端
<%= 变量 或者 表达式%>
<%= new java.util.Date()%>
--%>
jsp脚本
<%--jsp脚本片段--%>
<%
int sum = 0;
for (int i = 1; i<=100;i++){
sum+=i;
}
out.println("<h1>sum="+sum+"</h1>");
%>
jsp声明
<%--jsp声明--%>
<%!
static {
System.out.println("loading Servlet");
}
private int globalVar = 0;
public void kuang(){
System.out.println("进入了方法kuang");
}
%>
jsp声明:会被编译到jsp生成的java的类中!其他的,就会被生成到_jspService方法中!
在jsp,嵌入java代码即可!
jsp注释,不会在客户端显示,html会,除非抓包。
EL表达式
1.获取数据; 2.执行运算; 3.获取web开发的常用对象;
el表达式获取表单的数据 ${param.参数名}
jsp标签
<%--jsp:include--%>
<%--
http://loaclhost:8080/jsptag.jsp?name=kuangshen&age=12
-->
<jsp:forward page="/jsptag2.jsp">
<jsp:param name="name" value="kuangshen"></jsp:param>
<jsp:param name="age" value="12"></jsp:param>
</jsp:forward>
jstl表达式
jstl标签库的使用就是为了弥补html标签的不足;它自定义许多标签,可以供我们使用,标签的功能和java代码一样!
jstl使用步骤:
使用前必须导入对应的taglib,使用其中的方法,在tomcat也需要引入jstl的包,否则会报错:jstl解析错误
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
jdbc
jdbc项目步骤
1.创建一个maven项目
2.idea连接数据库
3.导入的依赖
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.28</version>
</dependency>
4.编写实体类
package com.wyc.test;
import java.sql.*;
public class TestJdbc {
public static void main (String[] args) throws ClassCastException, SQLException {
//配置信息
String url = "jdbc:mysql://localhost:3306/jdbcstudy?serverTimezone=UTC&useSSL=false&useUnicode=true&characterEncoding=utf-8";
String username = "root";
String password = "123456";
//1.加载驱动
try {
Class.forName("com.mysql.cj.jdbc.Driver");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
//2.连接数据库,代表数据库
Connection connection = DriverManager.getConnection(url, username, password);
//3.向数据库发送sql的对象Statement:CRUD
Statement statement = connection.createStatement();
//4.编写sql
String sql = "select * from users";
//5.执行查询sql,返回一个ResultSet :结果集
ResultSet rs = statement.executeQuery(sql);
while (rs.next()){
System.out.println("id"+rs.getObject("id"));
System.out.println("name"+rs.getObject("name"));
System.out.println("password"+rs.getObject("password"));
System.out.println("email"+rs.getObject("email"));
System.out.println("birthday"+rs.getObject("birthday"));
}
//6.关闭连接,释放资源 (一定要做,先开后关)
rs.close();
statement.close();
connection.close();
}
}
预编译
package com.wyc.test;
import java.sql.*;
//预编译sql
public class Test1Jdbc {
public static void main (String[] args) throws ClassCastException, SQLException, ClassNotFoundException {
//配置信息
String url = "jdbc:mysql://localhost:3306/jdbcstudy?serverTimezone=UTC&useSSL=false&useUnicode=true&characterEncoding=utf-8";
String username = "root";
String password = "123456";
//1.加载驱动
Class.forName("com.mysql.cj.jdbc.Driver");
//2.连接数据库,代表数据库
Connection connection = DriverManager.getConnection(url, username, password);
//3.编写sql
String sql ="insert into users (id, NAME, PASSWORD, email, birthday) VALUES (?,?,?,?,?);";
Statement statement = connection.createStatement();
//4.预编译
PreparedStatement preparedStatement = connection.prepareStatement(sql);
preparedStatement.setInt(1,7); //给第一个占位符赋值为1;
preparedStatement.setString(2,"q");
preparedStatement.setString(3,"eee");
preparedStatement.setString(4,"abdqq.com");
preparedStatement.setDate(5, new Date(new java.util.Date().getTime()));
//5.执行查询sql,
int i = preparedStatement.executeUpdate();
if (i>0){
System.out.println("插入成功");
}
//6.关闭连接,释放资源 (一定要做,先开后关)
statement.close();
connection.close();
}
}
事务
要么都成功,要么都失败!
ACID原则:保证数据的安全。
开启事务
事务提交
超市管理系统
项目搭建步骤:
第一步:导包
web.xml导入这个配置文件
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0" metadata-complete="true">
</web-app>
第二步:main文件创建java和resource。
第三步:配置tomcat。测试能不能跑起来。
第四步:导入项目中需要的jar包。 pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.example</groupId>
<artifactId>smbms</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>war</packaging>
<dependencies>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>javax.servlet.jsp-api</artifactId>
<version>2.3.3</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.28</version>
</dependency>
<dependency>
<groupId>javax.servlet.jsp.jstl</groupId>
<artifactId>jstl-api</artifactId>
<version>1.2</version>
</dependency>
<dependency>
<groupId>taglibs</groupId>
<artifactId>standard</artifactId>
<version>1.1.2</version>
</dependency>
</dependencies>
</project>
第五步:创建项目包结构
com.xxx
第六步:编写实体公共类
ORM映射:表-类映射
pojo编写实体类
7.编写基础公共类
1.数据库配置文件
dp.properities
driver=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/smbms?useSSL=true&useUnicode=true&characterEncoding=utf-8
username=root
password=123456
dao层编写操作数据库的公共类
BaseDao
package com.wyc.dao;
import java.io.*;
import java.sql.*;
import java.util.Properties;
/**
* \* Created with IntelliJ IDEA.
* \* User: 86177
* \* Date: 2021/12/18
* \* Time: 17:04
* \* To change this template use File | Settings | File Templates.
* \* Description:
* \
*/
public class BaseDao {
private static String driver;
private static String url;
private static String username;
private static String password;
//---------------------------------------------------------------------------------------
//静态代码块,类加载的时候就初始化了
static {
Properties properties = new Properties();
//通过类加载器读取对应的资源
//
try {
InputStream in = BaseDao.class.getClassLoader().getResourceAsStream("db.properties");
properties.load(in);
} catch (Exception e) {
e.printStackTrace();
}
driver = properties.getProperty("driver");
url = properties.getProperty("url");
username = properties.getProperty("username");
password = properties.getProperty("password");
}
//---------------------------------------------------------------------------------------
//获取数据库的连接
public static Connection getConnection() {
Connection conn = null;
try {
Class.forName(driver);
conn = DriverManager.getConnection(url, username, password);
return conn;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
//------------------------------------------------------------------------------------------------------------
//编写查询公共类
public static ResultSet execute(Connection conn, PreparedStatement preparedStatement, ResultSet resultSet, String sql, Object[] params) throws Exception {
preparedStatement = conn.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 execute(Connection conn, String sql, Object[] params, PreparedStatement preparedStatement) throws Exception {
preparedStatement = conn.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 conn, PreparedStatement preparedStatement, ResultSet resultSet) {
boolean flag = true;
if (resultSet != null) {
try {
resultSet.close();
resultSet = null;
} catch (Exception e) {
e.printStackTrace();
flag = false;
}
}
if (preparedStatement != null) {
try {
preparedStatement.close();
preparedStatement = null;
} catch (Exception e) {
e.printStackTrace();
flag = false;
}
}
if (conn != null) {
try {
conn.close();
conn = null;
} catch (Exception e) {
e.printStackTrace();
flag = false;
}
}
return flag;
}
}
编写字符编码过滤器
filter层创建CharacterEncodingFilter实现filter接口
package com.wyc.filter;
import javax.servlet.*;
import java.io.IOException;
public class CharacterEncodingFilter implements Filter {
public void init(FilterConfig filterConfig) throws ServletException {
}
public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws IOException, ServletException {
request.setCharacterEncoding("utf-8");
response.setCharacterEncoding("utf-8");
filterChain.doFilter(request, response);
}
public void destroy() {
}
}
并在web.xml配置
<!--字符编码过滤器-->
<filter>
<filter-name>CharacterEncodingFilter</filter-name>
<filter-class>com.wyc.filter.CharacterEncodingFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>CharacterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
登录功能
第一步:编写前端页面:
步骤1.在WEB-INF文件夹下创建login.jsp页面
<%@ page language="java" contentType="text/html; charset=UTF-8" isELIgnored="false"
pageEncoding="UTF-8" %>
<html>
<head lang="en">
<meta charset="UTF-8">
<title>系统登录 - 超市订单管理系统</title>
<link type="text/css" rel="stylesheet" href="${pageContext.request.contextPath }/css/style.css"/>
<script type="text/javascript">
/* if(top.location!=self.location){
top.location=self.location;
} */
</script>
</head>
<body class="login_bg">
<section class="loginBox">
<header class="loginHeader">
<h1>超市订单管理系统</h1>
</header>
<section class="loginCont">
<form class="loginForm" action="${pageContext.request.contextPath }/login.do" name="actionForm" id="actionForm"
method="post">
<div class="info">${error}</div>
<div class="inputbox">
<label for="userCode">用户名:</label>
<input type="text" class="input-text" id="userCode" name="userCode" placeholder="请输入用户名" required/>
</div>
<div class="inputbox">
<label for="userPassword">密码:</label>
<input type="password" id="userPassword" name="userPassword" placeholder="请输入密码" required/>
</div>
<div class="subBtn">
<input type="submit" value="登录"/>
<input type="reset" value="重置"/>
</div>
</form>
</section>
</section>
</body>
</html>
在web.xml配置
<!--设置欢迎页面-->
<welcome-file-list>
<welcome-file>login.jsp</welcome-file>
</welcome-file-list>
3.编写dao层登录用户的接口
package com.wyc.dao.user;
import com.wyc.pojo.Role;
import com.wyc.pojo.User;
import java.sql.Connection;
import java.util.List;
public interface UserDao {
//得到要登陆的用户
public User getLoginUser(Connection conn, String userCode) throws Exception;
4.编写dao接口的实现类
package com.wyc.dao.user;
import com.wyc.dao.BaseDao;
import com.wyc.pojo.Role;
import com.wyc.pojo.User;
//import com.wyc.cj.util.StringUtils;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;
/**
* \* Created with IntelliJ IDEA.
* \* User: 86177
* \* Date: 2021/12/19
* \* Time: 9:55
* \* To change this template use File | Settings | File Templates.
* \* Description:
* \
*/
public class UserDaoImpl implements UserDao {
//获取登录用户
public User getLoginUser(Connection conn, String userCode) throws Exception {
PreparedStatement pst = null;
ResultSet res = null;
User user = null;
if (conn != null) {
String sql = "select * from smbms_user where userCode =?";
Object[] params = {userCode};
res = BaseDao.execute(conn, pst, res, sql, params);
if (res.next()) {
user = new User();
user.setId(res.getInt("id"));
user.setUserCode(res.getString("userCode"));
user.setUserName(res.getString("userName"));
user.setUserPassword(res.getString("userPassword"));
user.setGender(res.getInt("gender"));
user.setBirthday(res.getDate("birthday"));
user.setPhone(res.getString("phone"));
user.setAddress(res.getString("address"));
user.setUserRole(res.getInt("userRole"));
user.setCreatedBy(res.getInt("createdBy"));
user.setCreationDate(res.getDate("creationDate"));
user.setModifyBy(res.getInt("modifyBy"));
user.setModifyDate(res.getDate("modifyDate"));
return user;
}
BaseDao.closeResource(null, pst, res);
}
return null;
}
}
5.业务层的接口
package com.wyc.service.user;
import com.wyc.pojo.Role;
import com.wyc.pojo.User;
import java.sql.Connection;
import java.util.List;
public interface UserService {
//用户登陆
public User login(String userCode, String password);
}
6.业务层实现类
package com.wyc.service.user;
import com.wyc.dao.BaseDao;
import com.wyc.dao.user.UserDao;
import com.wyc.dao.user.UserDaoImpl;
import com.wyc.pojo.User;
import com.wyc.service.user.UserService;
import java.sql.Connection;
import java.util.List;
/**
* \* Created with IntelliJ IDEA.
* \* User: 86177
* \* Date: 2021/12/19
* \* Time: 10:18
* \* To change this template use File | Settings | File Templates.
* \* Description:
* \
*/
public class UserServiceImpl implements UserService {
//业务层都会调用dao层,所以我们要引入dao层
private UserDao userDao;
public UserServiceImpl() {
userDao = new UserDaoImpl();
}
public User login(String userCode, String password) {
Connection conn = null;
User user = null;
try {
conn = BaseDao.getConnection();
//通过业务层调用对应的具体的数据库操作
user = userDao.getLoginUser(conn, userCode);
return user;
} catch (Exception e) {
e.printStackTrace();
} finally {
BaseDao.closeResource(conn, null, null);
}
return user;
}
}
7.编写Servlet
package com.wyc.servlet.user;
import com.wyc.pojo.User;
import com.wyc.service.user.UserServiceImpl;
import com.wyc.util.Constants;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* \* Created with IntelliJ IDEA.
* \* User: 86177
* \* Date: 2021/12/19
* \* Time: 13:36
* \* To change this template use File | Settings | File Templates.
* \* Description:
* \
*/
public class LoginServlet extends HttpServlet {
//Servlet:控制层,调用业务层代码
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("LoginServlet--start...");
//获取用户的用户名和密码
String userCode = req.getParameter("userCode");
String userPassword = req.getParameter("userPassword");
//和数据库中的密码进行对比,调用业务层
UserServiceImpl userService = new UserServiceImpl();
User user = userService.login(userCode, userPassword);
if (user != null && userPassword.equals(user.getUserPassword())) {
//查有此人
//将用户的信息放到Session中;
req.getSession().setAttribute(Constants.USER_SESSION, user);
//跳转到主页
resp.sendRedirect("jsp/frame.jsp");
} else {
//查无此人
//转发会登录页面,顺带提示他,用户名或密码错误
req.setAttribute("error", "用户名或密码不正确");
req.getRequestDispatcher("login.jsp").forward(req, resp);
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
8.注册servlet
web.xml
<!--Servlet-->
<servlet>
<servlet-name>LoginServlet</servlet-name>
<servlet-class>com.wyc.servlet.user.LoginServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>LoginServlet</servlet-name>
<url-pattern>/login.do</url-pattern>
</servlet-mapping>
登录功能优化
注销功能
在servlet/user/LoginoutServlet 编写代码,注销session,并在web.xml配置路径
第一步:注销session
public class LoginoutServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//移除用户的Constants.USER_SESSION
req.getSession().removeAttribute(Constants.USER_SESSION);
//返回登陆页面
resp.sendRedirect(req.getContextPath() + "/login.jsp");
}
第二步:配置路径
登录拦截优化
在wyc目录下新建filter文件夹,编写SysFilter
package com.wyc.filter;
import com.wyc.pojo.User;
import com.wyc.util.Constants;
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* \* Created with IntelliJ IDEA.
* \* User: 86177
* \* Date: 2021/12/19
* \* Time: 14:54
* \* To change this template use File | Settings | File Templates.
* \* Description:
* \
*/
public class SysFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest) servletRequest;
HttpServletResponse resp = (HttpServletResponse) servletResponse;
//过滤器,从Session中获取用户;
User user = (User) req.getSession().getAttribute(Constants.USER_SESSION);
if (user == null) {
//说明用户已经被注销或者被移除
resp.sendRedirect("/smbms/error.jsp");
} else {
filterChain.doFilter(req, resp);
}
}
@Override
public void destroy() {
}
}
在web.xml注册
<filter>
<filter-name>SysFilter</filter-name>
<filter-class>com.wyc.filter.SysFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>SysFilter</filter-name>
<url-pattern>/jsp/*</url-pattern>
</filter-mapping>
密码修改
解决乱码问题,文件保存为带bomUtf-8.
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?