request域(查询数据库,表单中获取数据,转发,重定向等),会话技术(cookie)
一.request域
1.查询数据库
代码如下:
JDBCUtil工具类:
package com.lanou3g;
import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;
import java.util.ResourceBundle;
public class JDBCUtil {
private static String driverClass;
private static String url;
private static String user;
private static String password;
static {
InputStream inputStream = JDBCUtil.class.getClassLoader().getResourceAsStream("dbinfo.properties");
Properties properties = new Properties();
try {
properties.load(inputStream);
System.out.println(properties.getProperty("driverClass"));
driverClass = properties.getProperty("driverClass");
url = properties.getProperty("url");
user = properties.getProperty("user");
password = properties.getProperty("password");
Class.forName(driverClass);
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static Connection getConnection() throws ClassNotFoundException, SQLException {
return DriverManager.getConnection(url,user,password);
}
public static void closeAll(ResultSet resultSet,Statement statement,Connection connection) {
if (resultSet != null) {
try {
resultSet.close();
} catch (SQLException e) {
}
}
if (statement != null) {
try {
statement.close();
} catch (SQLException e) {
}
}
if (connection != null) {
try {
connection.close();
} catch (SQLException e) {
}
}
}
}
servlet查询数据库代码:
package kll.com;
import java.io.IOException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.lanou3g.JDBCUtil;
public class Kll extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=utf8");
request.setCharacterEncoding("utf8");
// 获取用户请求的参数
// 参数是:传入的相当于key
// http://localhost:8080/sh-web-02/demo12?username=konglinglei&password=123456
String username = request.getParameter("username");
String password = request.getParameter("password");
System.out.println(username);
System.out.println(password);
// 查询数据库
String sql = "select * from users where username=? and password=?";
Connection connection = null;
PreparedStatement statement = null;
ResultSet resultSet = null;
try {
// 获取连接
connection = JDBCUtil.getConnection();
// 获取执行对象
statement = connection.prepareStatement(sql);
// 替换占位符
statement.setObject(1, username);
statement.setObject(2, password);
// 查询方法 获取结果集
resultSet = statement.executeQuery();
while (resultSet.next()) {
System.out.println("查询成功");
}
} catch (ClassNotFoundException | SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
JDBCUtil.closeAll(resultSet, statement, connection);
}
}
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
}
2.表单中获取数据
- 设置响应编码格式
- response.setContentType(“text/html;charset=utf8”);
- 防止请求过来的数据乱码(解决post请求乱码)
- request.setCharacterEncoding(“utf8”);
form表单代码(html):
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<!--
form表单
action 要提交到的页面的地址 从8080后开始填 即要带上工程名
-->
<form action="/sh-web-03/demo01" method="post">
<!-- name标签 相当于使用request获取参数方法的key-->
账号:<input type="text" name="username"><br/>
密码:<input type="text" name="password"><br/>
<input type="submit" value="提交">
</form>
</body>
</html>
获取信息的Java代码:
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class Kll extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 设置响应编码格式
response.setContentType("text/html;charset=utf8");
// 防止请求过来的数据乱码(解决post请求乱码)
request.setCharacterEncoding("utf8");
// 获取表单请求过来的参数
// 传入的参数就是表单中的 name标签
String username = request.getParameter("username");
String password = request.getParameter("password");
System.out.println(username + " " + password);
}
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
}
例题:
需要导入jar包:BeanUtils和loging.
需求:把以下html中表单的信息提取出来,封装到对象里.
- 注意:
- 1.使用的实体类对象 必须符合JavaBean规范
-
- 实体类的成员变量要和获取的参数一样(且成员变量不能多于获取的参数,可以少)
- 3.实体类的成员变量名 要和 name标签名要相同
form表单的主要代码:
<form action="/sh-web-03/demo02" method="get">
账号:<input type="text" name="username"><br/>
密码:<input type="text" name="password"><br/>
男<input type="radio" checked="checked" name="sex" value=""><br/>
女<input type="radio" name="sex" value="女"><br/>
篮球<input type="checkbox" name="hobby" value="篮球">
唱歌<input type="checkbox" name="hobby" value="唱歌">
画画<input type="checkbox" name="hobby" value="画画"><br/>
<select name="city">
<option>---请选择---</option>
<option value="sh">上海</option>
<option value="bj">北京</option>
<option value="gz">广州</option>
</select><br/>
<input type="submit" value="提交">
</form>
封装的user类:
package com.lanou3g;
import java.util.Arrays;
/*
* 建议:实体类中的成员变量名 和表单中name标签 和数据库中表的字段名 一样
*/
public class User {
private String username;
private String password;
private String sex;
private String[] hobby;
private String city;
public User() {
}
public User(String username, String password, String sex, String[] hobby, String city) {
this.username = username;
this.password = password;
this.sex = sex;
this.hobby = hobby;
this.city = city;
}
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 String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public String[] getHobby() {
return hobby;
}
public void setHobby(String[] hobby) {
this.hobby = hobby;
}
public String getCity() {
return city;
}
public void setCity(String city) {
this.city = city;
}
@Override
public String toString() {
return "User [username=" + username + ", password=" + password + ", sex=" + sex + ", hobby="
+ Arrays.toString(hobby) + ", city=" + city + "]";
}
}
servlet的Java代码:
package kll.com;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.util.Arrays;
import java.util.Enumeration;
import java.util.Map;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.beanutils.BeanUtils;
public class Kll extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 设置响应编码格式
response.setContentType("text/html;charset=utf8");
// 防止请求过来的数据乱码(解决post请求乱码)
request.setCharacterEncoding("utf8");
// 利用BeanUtils直接将请求的参数封装成一个对象
// 参数2:从请求中获取的参数的map集合
User user = new User();
try {
BeanUtils.populate(user, request.getParameterMap());
System.out.println(user);
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
3.请求转发
作用域:一次转发内有效
- 请求转发(一次请求 请求结束就销毁)
- 注意:最终响应回浏览器的内容是 转发到的页面的响应
request域转发:从kll类转发到kll1类
kll类代码:
package kll.com;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class Kll extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=utf8");
request.setCharacterEncoding("utf8");
// 获取字符流
PrintWriter writer = response.getWriter();
// 在request域中保存值
request.setAttribute("key", "kll");
// 使用request对象 进行请求转发
// 获取请求转发器
RequestDispatcher dispatcher = request.getRequestDispatcher("/kll1");
dispatcher.forward(request, response);
// 响应回浏览器
writer.write("123");
System.out.println("kll end!");
}
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
}
kll1类代码:
package kll.com;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class Kll1 extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=utf8");
request.setCharacterEncoding("utf8");
// 响应回浏览器
response.getWriter().write("456");
Object value = request.getAttribute("key");
System.out.println(value);
}
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
}
浏览器的运行结果:
eclipse中的console运行结果:
4.重定向(测试作用域)
只需要把上边的获取转发器和发送转发请求两行代码换成如下的代码即可:
response.sendRedirect("/practice/kll1");
运行结果图(浏览器的):
eclipse中的console运行结果:
5.包含方法
请求包含(一次请求 并且两个页面的响应都会返回给浏览器)
主要代码如下:
可以直接替换掉上面转发的转发器获取和请求发送代码.
// 获取转发器
RequestDispatcher dispatcher = request.getRequestDispatcher("/kll1");
// 包含方法
dispatcher.include(request, response);
二.会话技术
- 指的是客户端(用户/浏览器)和服务端进行的交互.
- 一次会话 只有当关闭浏览器时 这次会话才会结束
- 包含:
-
1.客户端技术(浏览器实现) cookie
- Cookie的使用流程
- 1.当用户第一次访问服务器时
- 服务器可以创建一个cookie出来
- 并且添加到响应中,响应回客户(浏览器)
- 2.当浏览器接收到携带了cookie的响应后
- 会将cookie保存在本地文件
- 3.当用户再一次访问服务器时
- 会携带着cookie一起访问
- 这时服务器端拿到cookie可以使用
- 4.默认当浏览器关闭时 会话结束,浏览器销毁保存cookie
- (可以设置cookie存活时间,当时间到了 才会销毁)
- cookie的使用
- 1.每个网站最多可以保存20个cookie到浏览器中
- 2.每个cookie最多4kb(只能保存小数据)
- 3.每个浏览器最多可以保存300个cookie
- 4.cookie中不能保存中文
- 设置cookie 存活时间
- setMaxAge 以秒为单位 60*5 5分钟
- 正值 cookie到时间被销毁
- 负值 浏览器不会保存cookie,即会话结束,直接销毁
- 0值 会立即删除cookie
- Cookie的使用流程
- 2.服务端技术 HttpSession
-
1.客户端技术(浏览器实现) cookie
cookie的使用流程图:
例题:需求:显示上一次(最后)的登录时间 ,(关闭浏览器之后 再访问还能显示) .
注意:配置XML是路径也要加上servlet,访问地址也是.
xml配置代码如下:
<servlet>
<servlet-name>kll</servlet-name>
<servlet-class>kll.com.Kll</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>kll</servlet-name>
<url-pattern>/servlet/kll</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>kll1</servlet-name>
<servlet-class>kll.com.Kll1</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>kll1</servlet-name>
<url-pattern>/servlet/kll1</url-pattern>
</servlet-mapping>
代码如下:
package kll.com;
import java.io.IOException;
import java.io.PrintWriter;
import java.text.SimpleDateFormat;
import java.util.Date;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class Kll extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=utf8");
request.setCharacterEncoding("utf8");
// 从请求中获取cookie
Cookie[] cookies = request.getCookies();
// 判断是否有cookie
if (cookies != null) {
for (Cookie cookie : cookies) {
// 找出叫lastTime的cookie
if (cookie.getName().equals("lastTime")) {
// 获取保存值
String value = cookie.getValue();
// 字符串转long型
long time = Long.parseLong(value);
// 转成时间
Date date = new Date(time);
// 将日期对象格式化
SimpleDateFormat sdf = new SimpleDateFormat("yyyy:MM:dd HH:mm:ss");
// 格式化
String format = sdf.format(date);
// 将时间显示到浏览器
response.getWriter().write(format);
//System.out.println(format);
}
}
}
// 创建一个cookie
Cookie cookie = new Cookie("lastTime", System.currentTimeMillis() + "");
// 设置存活时间
cookie.setMaxAge(60*5);
// 设置保存路径
// / 表示工程下 所有的servlet类都能拿到这个cookie
// /sh-web-03/servlet
// 只有访问路径是servlet下的类才能获取到cookie
cookie.setPath("/practice/servlet");
// 保存到响应中
response.addCookie(cookie);
}
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
}
运行一次,结果为空白;
运行第二次,结果图为:
测试其他servlet对象是否也可以访问cookie.
注意:其他的servlet对象在配置xml和访问路径也要和创建是路径一样.
代码如下:
package kll.com;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class Kll1 extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=utf8");
request.setCharacterEncoding("utf8");
// 从请求中获取cookie
Cookie[] cookies = request.getCookies();
// 判断是否有cookie
if (cookies != null) {
for (Cookie cookie : cookies) {
// 找出叫lastTime的cookie
if (cookie.getName().equals("lastTime")) {
// 获取保存值
String value = cookie.getValue();
// 字符串转long型
long time = Long.parseLong(value);
// 转成时间
Date date = new Date(time);
// 将日期对象格式化
SimpleDateFormat sdf = new SimpleDateFormat("yyyy:MM:dd HH:mm:ss");
// 格式化
String format = sdf.format(date);
// 将时间显示到浏览器
response.getWriter().write(format);
//System.out.println(format);
}
}
}
}
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
}
运行结果如***意:地址与上面的是不同的