- 实验目的
掌握服务器端技术Servlet,理解Servlet的生命周期;掌握Jsp的实质,认识out、
request、response、session、application等JSP内置对象,灵活应用这些内置对象进行实际与数据库相连的项目开发。
- 实验环境
IDEA2022.2
- 实验内容
使用JSP+JDBC完成一个用户登录的程序,然后实现对一张表的添加、删除、查找和修
改操作。
- 实验步骤
1、引入jdbc包
2、新建数据库test并建立表student2
Jdbc
public class TestJDBC4 {
public static void main(String[] args) throws ClassNotFoundException, SQLException {
//注册驱动
Class.forName("com.mysql.jdbc.Driver");
//定义连接参数
String url="jdbc:mysql://localhost:3306/java2302?"+
"userSSl=true&useUnicode=true&characterEncoding=utf8";
String usernanme="root";
String password="root";
//获取连接
Connection connection= DriverManager.getConnection(url,usernanme,password);
Statement statement=connection.createStatement();
//执行sql,接收输入的登录参数,用户的登录用户名和密码
System.out.println("请输入登录用户名");
String name=new Scanner(System.in).nextLine();
System.out.println("请输入登录密码");
String pwd=new Scanner(System.in).nextLine();
//定义sql
/*
* sql注入,开发过程中一些不规范导致出现安全风险
* */
String sql="select * from user where name = ? and password= ?";
//获得安全传输器
PreparedStatement preparedStatement = connection.prepareStatement(sql);
//将sql里面的参数信息填充到sql语句里
preparedStatement.setObject(1,name);
preparedStatement.setObject(2,pwd);//在拼接的时候会字段在两边添加引号‘’
//执行查询操作
//打印sql语句观察是否有问题
System.out.println(sql);
ResultSet resultSet= preparedStatement.executeQuery();
//判断是否能登录成功
if (resultSet.next()){
System.out.println("登录成功");
}else{
System.out.println("登录失败");
}
//关闭资源
resultSet.close();
preparedStatement.close();
connection.close();
}
- 在web.xml中配置Servlet
<?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">
<!--此处配置servlet资源-->
<servlet>
<!--servlet名称-->
<servlet-name>helloServlet</servlet-name>
<!--配置servlet全路径-->
<servlet-class>com.BlackTea.servlet.HelloServlet</servlet-class>
</servlet>
<!--servlet 映射信息-->
<servlet-mapping>
<servlet-name>helloServlet</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>MyServlet1</servlet-name>
<servlet-class>com.BlackTea.servlet.MyServlet1</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>MyServlet1</servlet-name>
<url-pattern>/myservlet1</url-pattern>
</servlet-mapping>
<!--配置servlet2-->
<servlet>
<servlet-name>MyServlet2</servlet-name>
<servlet-class>com.BlackTea.servlet.MyServlet2</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>MyServlet2</servlet-name>
<url-pattern>/myservlet2</url-pattern>
</servlet-mapping>
<!--配置servlet3-->
<servlet>
<servlet-name>MyServlet3</servlet-name>
<servlet-class>com.BlackTea.servlet.MyServlet3</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>MyServlet3</servlet-name>
<url-pattern>/myservlet3</url-pattern>
</servlet-mapping>
<!--配置servlet4-->
<servlet>
<servlet-name>MyServlet4</servlet-name>
<servlet-class>com.BlackTea.servlet.MyServlet4</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>MyServlet4</servlet-name>
<url-pattern>/myservlet4</url-pattern>
</servlet-mapping>
<!--配置servlet5-->
<servlet>
<servlet-name>MyServlet5</servlet-name>
<servlet-class>com.BlackTea.servlet.MyServlet5</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>MyServlet5</servlet-name>
<url-pattern>/myservlet5</url-pattern>
</servlet-mapping>
</web-app>
- 创建index.jsp页面
<%--
Created by IntelliJ IDEA.
User: 黑猹
Date: 2023/4/6
Time: 20:49
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>$Title$</title>
</head>
<body>
<%-- 首页信息--%>
<h1>测试servlet</h1> <br>
<a href="hello">测试helloServlet</a> <br>
<a href="myservlet1">测试MyServlet1</a> <br>
<%--测试get请求和post请求--%>
<a href="myservlet2">测试MyServlet2</a> <br>
<form action="myservlet2" method="post">
用户名称:<input type="text" name="username">
用户密码:<input type="password" name="password">
<input type="submit" value="登录">
</form>
<%--测试请求的相关参数--%>
<a href="myservlet3">测试myservlet3</a> <br>
<%--测试响应的信息--%>
<a href="myservlet4">测试myservlet4</a> <br>
<form action="myservlet4" method="post">
用户名称:<input type="text" name="username">
用户密码:<input type="password" name="password">
<input type="submit" value="测试重定向">
</form>
<%--测试会话技术--%>
<a href="myservlet5">测试myservlet5</a> <br>
<%--form表单测试session会话域--%>
<form action="myservlet5" method="post">
用户名称:<input type="text" name="username">
用户密码:<input type="password" name="password">
<input type="submit" value="测试Session">
</form>
</body>
</html>
- 创建web.jsp页面
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>系统首页</title>
</head>
<body>
<h1>您已进入系统首页</h1>
<%--通过el表达式,将后台分装传递的信息显示出来--%>
<h2>${msg}</h2>
</body>
</html>
- 创建过滤器 CharacterFilter 解决中文乱码问题
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
public class CharacterFilter implements Filter {
public void init(FilterConfig filterConfig) throws ServletException {
}
public void doFilter(ServletRequest req, ServletResponse resp,
FilterChain chain) throws IOException, ServletException {
1 HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) resp;
// 拦截所有的请求 解决全站中文乱码
// 指定 request 和 response 的编码
request.setCharacterEncoding("utf-8"); // 只对消息体有效
response.setContentType("text/html;charset=utf-8");
// 在放行时 应该给目标资源一个request对象 让目标资源调用
// getParameter时调到我们写的getParameter
// 对request进行包装
CharacterRequest characterRequest = new CharacterRequest(request);
//放行
chain.doFilter(characterRequest, response);
}
. public void destroy() {
}
}
// 针对 request 对象进行包装
// 继承 默认包装类HttpServletRequestWrapper
class CharacterRequest extends HttpServletRequestWrapper {
public CharacterRequest(HttpServletRequest request) {
super(request);
}
. // 子类继承父类一定会覆写一些方法,此处用于重写getParamter()方法
public String getParameter(String name) {
// 调用 被包装对象的getParameter()方法 获得请求参数
String value = super.getParameter(name);
if (value == null)
return null;
// 判断请求方式
String method = super.getMethod();
if ("get".equalsIgnoreCase(method)) {
try {
value = new String(value.getBytes("iso-8859-1"), "utf-8");
} catch (UnsupportedEncodingException e) {
throw new RuntimeException(e);
}
}
// 解决乱码后返回结果
return value;
}
- 用户登录
package com.BlackTea.servlet;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
/**
* @Author: Yeman
* @Date: 2023-04-13-20:10
* @Description:测试响应相关操作
*/
public class MyServlet4 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//设置响应头,防止中文乱码
resp.setHeader("Content-Type","text/html;charset=UTF-8");
//测试,前端发起servlet4请求,响应一串字符串
PrintWriter writer =resp.getWriter();
writer.write("你好servlet响应对象");
writer.close();
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//配置重定向信息
//进行重定向到success界面
resp.sendRedirect("/success.jsp");
}
}