• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
珍珠奶茶不加糖
博客园    首页    新随笔    联系   管理    订阅  订阅
JavaWeb之Servlet

Servlet

Servlet

什么是Servlet

  • Servlet是一组规范,包含了与服务端小程序相关的API
  • Servlet是运行在服务器(Tomcat)的小程序
  • 作用/功能
    • 用来接收客户端的请求,并对客户端进行响应
  • 通常使用的是HTTP协议

如何开发/使用一个Servlet

    • Servlet
      • 接口
      • 规范了客户端浏览器与服务端如何进行交互
      • 提供了相应的API
        • Servlet对象不是由程序员创建,而是由Tomcat创建的,包括回收Servlet对象,也是由Tomcat来做的
        • init() -- 对Servlet进行初始化
          • 当Tomcat创建完Servlet对象后,将会调用init方法对Servlet对象进行初始化
        • service() -- 提供服务,处理/响应当前请求
          • ServletRequest:请求对象
          • ServletResponse:响应对象
        • getServletConfig() -- 获取配制信息,返回Serclet的配制信息
          • ServletConfig不能自己创建
        • getServletInfo() -- 获取描述信息,返回Servlet说明
        • destroy() -- 当处理完请求/响应后,Tomcat会销毁当前的Servlet对象
      • 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">

    <servlet>
        <servlet-name>ServletTest</servlet-name>
        <servlet-class>ServletTest</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>ServletTest</servlet-name>
        <url-pattern>/login.do</url-pattern>
    </servlet-mapping>
    
</web-app>

 

  • GenericServlet
    • 它是Servlet接口的实现类
    • 此实现类可以实现HTTP协议的请求,也可以实现非HTTP协议的请求
  • HttpServlet(常用)
    • 它是Servlet接口的实现类
    • 此实现类可以实现HTTP协议的请求

Servlet处理请求(ServletRequest)

  • 此接口封装了所有客户端的请求参数
  • 此接口对象是由Servlet容器(Tomcat)创建
  • 此接口中提供了相应的函数/方法来获取请求的参数
  • HttpServletRequest是继承ServletRequest接口
  • HttpServletRequest主要针对HTTP协议,方法是针对HTTP请求的
  • ServletRequest常用的方法
    • getParameter(String) -- 根据请求的参数名称获取请求的参数值
    • getParameterValues(String) -- 根据请求的参数名称获取请求的参数值(返回一个数组)
    • getParameterNames() -- 获取请求参数中所有的name属性值(返回值 Enumeration)枚举
    • getParameterMap() -- 获取请求参数,以Map(String,String[])集合形式返回
  • HttpServletRequest常用方法
    • String   getHeader(String) -- 根据指定的请求头key,获得对应的value值
    • Enumeration   getHeaderNames() -- 获取所有消息头的信息
    • int   getIntHeader() -- 获得消息头指定的key的value值,并转换成int类型
    • String   getMethod() -- 获得请求方法的类型
    • String   getProtocol() -- 获取HTTP协议版本
    • String   getRequestURI() -- 获取当前请求地址
    • StringBuffer   getRequestURL() -- 获取完整的访问请求路径
    • String   getServletPath() -- 获得服务端的请求路径(不包含应用名)
    • String   getContextPath() -- 获得部署后的应用名称
    • String   getQueryString() -- url中查询字符串

Servlet处理响应(ServletResponse)

  • 当服务端向客户端响应结果时,需要使用ServletResponse
  • ServletResponse是Servlet容器创建的
  • 向客户端浏览器发送一些响应的结果信息
  • 常用方法
    • setContentType() -- 设置向客户端返回数据的类型
    • PrintWrite getWrite() -- 返回打印流,可以使用此打印流向客户端响应数据
  • HttpServletResponse常用方法
    • 继承自ServletResponse
    • void sendRedirect(String) -- 重定向

案例代码--登录

    • dao
package com.oracle.dao;
import com.oracle.util.JdbcUtil;
import com.oracle.vo.User_web;
import java.util.List;
public class UserWebDao {
    public List<User_web> Login (String username,String password){
        String sql = "select * from user_web where username=? and pwd =?";
        List<User_web> list = JdbcUtil.executeQuery(User_web.class,sql,username,password);

        System.out.println(list);
        return list;
    }
}

 

    • service
package com.oracle.service;
import com.oracle.dao.UserWebDao;
import java.util.List;
public class LoginService {
    private UserWebDao userWebDao;
    public LoginService(){
        userWebDao = new UserWebDao();
    }
    public boolean Login(String username,String password){
        List list = userWebDao.Login(username,password);
        if(list.isEmpty()){
            return false;
        }else{
            return true;
        }
    }
}

 

    • servlet
package com.oracle.servlet;
import com.oracle.service.LoginService;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
@WebServlet(name = "LoginServlet",urlPatterns = "/login.do")
public class LoginServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    }
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //获取账号密码
        String username = request.getParameter("username");
        String password = request.getParameter("password");
        LoginService loginService = new LoginService();
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();
        if(loginService.Login(username,password)){
            response.sendRedirect("yes.html");
        }else{
            response.sendRedirect("no.html");
        }
    }
}

 

    • JDBC
package com.oracle.util;
import java.lang.reflect.Field;
import java.sql.*;
import java.util.ArrayList;
import java.util.List;
public class JdbcUtil {
    static{
        try {
            Class.forName("com.mysql.jdbc.Driver");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
    public static Connection getConnection(){
        Connection conn = null;
        try {
            conn = DriverManager.getConnection("jdbc:mysql://IP地址:3306/java2006?characterEncoding=utf8","账号","密码");
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return conn;
    }
    public static int executeUpdate(String sql,Object...args){
        int count = 0;
        try(Connection conn= JdbcUtil.getConnection(); PreparedStatement ps=conn.prepareStatement(sql)){
            for(int i=0;i<args.length;i++){
                ps.setObject(i+1,args[i]);
            }

            count = ps.executeUpdate();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return count;
    }
    public static <T> List<T> executeQuery(Class<T> clazz, String sql, Object...args){
        List<T> list = new ArrayList<T>();
        try(PreparedStatement ps = getConnection().prepareStatement(sql);) {
            for(int i=0;i<args.length;i++){
                ps.setObject(i+1,args[i]);
            }
            ResultSet rs = ps.executeQuery();
            Field[] fields = clazz.getDeclaredFields();  //获取传递类实例中所有的属性
            while(rs.next()) {
                T t = clazz.newInstance();
                for(Field field : fields){
                    field.setAccessible(true);
                    field.set(t,rs.getObject(field.getName()));
                }
                list.add(t);
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InstantiationException e) {
            e.printStackTrace();
        }
        return list;
    }
}

 

    • vo
package com.oracle.vo;
public class User_web {
    private Integer id;
    private String username;
    private String pwd;
    private String chinese_name;
    public User_web() {
    }
    public User_web(Integer id, String username, String pwd, String chinese_name) {
        this.id = id;
        this.username = username;
        this.pwd = pwd;
        this.chinese_name = chinese_name;
    }
    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    public String getPwd() {
        return pwd;
    }
    public void setPwd(String pwd) {
        this.pwd = pwd;
    }
    public String getChinese_name() {
        return chinese_name;
    }
    public void setChinese_name(String chinese_name) {
        this.chinese_name = chinese_name;
    }
    @Override
    public String toString() {
        return "User_web{" +
                "id=" + id +
                ", username='" + username + '\'' +
                ", pwd='" + pwd + '\'' +
                ", chinese_name='" + chinese_name + '\'' +
                '}';
    }
}

 

    • login.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<form action="login.do" method="get">
    账户:<input type="text" name="username"><br>
    密码:<input type="password" name="password"><br>
    <input type="submit" value="登录">
</form>
</body>
</html>

 

    • yes,html
<html>
    <head>
        <tittle></tittle>
    </head>
    <body>
    <h1>登录成功</h1>
    <h1>啦啦啦,热部署测试</h1>
    </body>
</html>

 

    • no.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>登录失败</title>
</head>
<body>
<h1>登录失败</h1>
</body>
</html>

 

会话

  • 会话称为Session
  • 当客户端浏览器第一次访问服务端时,服务端会创建一个"标识",然后将标识响应客户端浏览器,客户端浏览器在第二次发送请求时,将携带这个标识发送给服务器。这个时候服务端就知道当前客户端的身份了
  • HTTP协议是无状态无连接的,本身不具备识别客户端浏览器身份的,需要借助于提供的会话来实现状态识别的效果
  • 特点:
    • 在客户端浏览器不关闭的情况下,服务器会识别出客户端浏览器的身份
    • 在客户端浏览器关闭的情况下,标识将会被清空,再次打开客户端浏览器时,标识就没有了,再次请求时,服务器识别不到客户单浏览器的身份,服务器就会创建一个新的标识,响应给客户端浏览器
  • 在一个会话中,可以实现多个请求,并且可以通过会话来实现数据共享

Servlet实现会话

    • 实现会话跟踪
      • HttpSession接口
    • 如何获得一个会话
      • HttpSession session = request.getSession()
    • 常用的方法
      • session本身方法
        • getId()
          • 获得会话id
          • 此id是由Servlet容器创建的
          • 它是当前会话的位移标识符
        • getCreationTime -- 获取会话创建时间
        • getLestAccessedTime() -- 最后一次访问会话的时间
        • getMaxInactiveInterval() -- 获得最大的间隔时间(seconds,单位:秒)
        • setMaxInactiveTime() -- 设置最大的间隔时间
        • isNew() -- 是否是新创建的会话
        • invalidate() -- 让session解除绑定/失效
      • session对数据操作方法
        • setAttribute(String name,Object object) -- 将数据存储到session会话对象中,以键值对形式体现
        • Object   getAttribute(String name) -- 通过指定的属性名称获取相应的值
        • removeAttribute(String name) -- 移除session中指定的key/value
        • Enumeration   getAttributeNames()获取所有的key值
      • 设置Session最大间隔时间
        • 方法一:setMaxInactiveTime(时间,秒)
        • 方法二:在web.xml中修改(单位:分钟)
        • 通过web.xml配制session的最大间隔时间,所有的session对象都生效
<session-config>
    <session-timeout>时间(单位:分钟)</session-timeout>
</session-config> 

 

Cookie

  • Cookie
    • 由于session会话对象不能长期保存一些信息,所以,可以使用浏览器中的Cookie文件来存储信息
    • Cookie中可以存储少量的文本信息
    • Cookie是由服务端向客户端浏览器发送的信息
    • 客户端浏览器得到信息后,将信息回传到服务端
    • 应用场景与Session类似,区别是Session不能长期保存,浏览器关闭后Session会被销毁,Cookie数据不会消失,下一次启动浏览器时,可以从Cookie中读取数据,同时,Cookie文件中的数据可以设置有效市场,超过时长范围会自动清空
    • Cookie从使用角度
      • 购物车
      • 自动登录

操作Cookie

  • 创建Cookie
  • 服务端向客户端发送信息
  • 客户端接收服务端发送的信息

ServletContext

  • Servlet上下文对象
  • 此接口对象是由Servlet容器创建的(Tomcat)
  • 通过此上下文对象对Web容器进行访问
  • 当Tomcat启动后,会为每一个应用创建一个唯一的上下文对象(ServletContext)
  • 获取
    • HttpSession
      • request.getSession().getServletContext()
    • HttpServletRquest
      • request.getServletContext()
  • 常用方法
    • 数据操作
      • void setAttribute(String name,Object object)
      • Object getAttribute(String name)
      • void removeAttribute()
      • Enumeration getAttributeNames()
    • 容器操作
      • String getRealPath(String path)
      • String getContextPath()

ServletConfig

    • ServletConfig接口是由Servlet创建的
    • ServletConfig对象主要是用于配制Servlet的信息的
    • 作用:当Servlet启动时,可以读取外部的配制信息,对Servlet进行初始化
    • 使用方式
      • XML
<init-param>
    <param-name>:参数名
    <param-value>:参数值
</init-param>
<load-on-startup>优先级 -- 在Tomcat启动时便启动 </load-on-startup>

 

      • Annotation
@WebServlet(name = "MyInitServlet",urlPatterns = "/init.do",loadOnStartup = 1,
    initParams = {
    @WebInitParam(name = "driver",value = "com.mysql.jdbc.Driver"),
    @WebInitParam(name = "url",value = "jdbc:mysql://localhost:3306/java")
    //等等等等
    }
)

 

  • 常用方法
    • String getInitParameter(String name) -- 根据指定的参数名获得参数值
    • Enumeration getInitParameterNames() -- 获得所有参数的名称
    • ServletContext getServletContext() -- 获取ServletContext上下文对象
如有问题,请发送邮件至buxiaqingcheng@163.com或者buxiaqingcheng@dingtalk.com
posted on 2020-09-25 16:38  珍珠奶茶不加糖  阅读(192)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3