CLSays:很久很久之前在学校的时候学习过javaweb,依稀记得当时做的是一个购物车的实验,做完后天真的以为java后台不过如此嘛。嗯…再后来我就去做安卓了,哈哈。
1. Servlet 生命周期
- Servlet 在接受到用户请求的时候,先去web.xml 文件寻找对应的映射Servlet class,然后去初始化Servlet对象
- 停止tomcat 服务的时候 Servlet 也会被销毁
- 在web.xml 的servlet 标签中加入 load on startUp 标签属性,启动tomcat的时候这个servlet 就会被创建
2. 用户登录实战
- 用户访问,进入登录界面
- 登录界面提交form 表单
- 拿到form表单数据 和数据库中的user 数据对比
- 返回成功与否
EnterServlet.java:
package com.cailei;
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;
public class EnterServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request,response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("请求来了");
PrintWriter writer = response.getWriter();
response.setContentType("text/html");
writer.write("<html>");
writer.write("<head>");
writer.write("</head>");
writer.write("<body>");
writer.write("<form action=\"login\" method=\"GET\">");
writer.write("用户名:<input type=\"text\" value=\"\" name=\"userName\"></br>");
writer.write("密码:<input type=\"text\" value=\"\" name=\"passWord\"> </br>");
writer.write(" <input type=\"submit\" value=\"登录\">");
writer.write("</form>");
writer.write("</body>");
writer.write("</html>");
}
}
LoginServlet.java:
package com.cailei;
import com.cailei.entity.User;
import com.cailei.service.UserService;
import com.cailei.service.UserServiceImpl;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class LoginServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request,response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String userName= request.getParameter("userName");
String passWord = request.getParameter("passWord");
User user = new User(userName,passWord);
UserService userService = new UserServiceImpl();
User resultUser = userService.checkUser(user);
if(resultUser!=null){
response.getWriter().write("success login!");
}else {
response.getWriter().write("failed login!");
}
}
}
UserDaoImpl.java:
package com.cailei.dao;
import com.cailei.entity.User;
import java.sql.*;
public class UserDaoImpl implements UserDao {
//跟数据库发生交互
@Override
public User checkUser(User user) {
//定义连接的对象
Connection connection = null;
PreparedStatement preparedStatement =null;
ResultSet resultSet =null;
User u =null;
//加载驱动
try {
Class.forName("com.mysql.cj.jdbc.Driver");
connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/user?useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=UTC", "root", "cailei666");
//获取预处理快
preparedStatement = connection.prepareStatement("select * from User where name = ? and password = ?");
//给?赋值
preparedStatement.setString(1,user.getUserName());
preparedStatement.setString(2,user.getPassWord());
//执行sql
resultSet = preparedStatement.executeQuery();
while (resultSet.next()){
u = new User(resultSet.getString("name"),resultSet.getString("password"));
}
} catch (Exception e) {
e.printStackTrace();
}finally {
try {
resultSet.close();
} catch (SQLException e) {
e.printStackTrace();
}
try {
preparedStatement.close();
} catch (SQLException e) {
e.printStackTrace();
}
try {
connection.clearWarnings();
} catch (SQLException e) {
e.printStackTrace();
}
}
return u;
}
}
3. servlet 请求转发
当登录失败的时候,需要清空这个界面,这就需要用到请求转发
request.getRequestDispatcher(“enter”).forward(request,response);
4. servlet请求转发(直接实现数据共享)
request.setAttribute(“str”,“用户名或者密码错误”);
5. servlet 重定向
response.sendRedirect(“hello”);
重定向和请求转发的区别,请求转发只发出了一次请求,重定向发送了2次请求,且第二次请求的requet和第一次的不一样。
6. Servlet cookie
当客户端发送多次请求时,且需要相同的请求参数,如何处理
Cookie:
- Cookie 是存在于浏览器端的,以key-value形式存在
- Cookie 是服务器给客户端发送的数据缓存
- Cookie 有时长限制,不设置时长默认就是保存在内存中,浏览器关闭后cookie就会失效
- Cookie 可以设置指定访问路径,只有访问指定的Cookie路径才会在请求头中携带相对应的Cookie
7. Session 会话
Cookie 技术可以将用户的信息保存在各自的浏览器中,并且可以在多次请求下实现数据的共享。当时,如果传递的信息比较多,使用Cookie技术显然会增大服务器端程序处理的难的。这是,可以使用Session实现,Session是一种将会话数据保存到服务端的技术。
Session 技术好比医院发送的病人的就医卡和医院为每个病人保留病例案例档案的过程。当浏览器访问web服务器的时候,Servlet容器就会自动创建一个Session对象和ID属性,其中Session对象相当于病例档案,ID就相当于就医卡号。当客户端后面再访问服务器的时候,只要将这个id传给服务器,服务器就能得到相对应的Session,就能知道是那个客户端发送的。
需要注意的是,由于客户端需要接收,记录和回送Session对象的ID,所以,通常情况下,Session是借助Cookie技术来传递ID属性的。