JavaWeb之Servlet技术

servlet

Java Servlet 是运行在 Web 服务器或应用服务器上的程序,它是作为来自 Web 浏览器或其他 HTTP 客户端的请求和 HTTP 服务器上的数据库或应用程序之间的中间层,使用 Servlet,可以收集来自网页表单的用户输入,呈现来自数据库或者其他源的记录,还可以动态创建网页。

servlet的几个特点:

  1. 由服务器调用和执行
  2. 使用Java语言编写
  3. 按照servlet规范开发
  4. 功能强大,几乎可以完成所有的网站功能
  5. 是jsp 的基础

servlet的体系结构

servlet的生命周期

  1. 装载servlet,由相应的容器来完成
  2. .创建一个servlet实例
  3. 调用servlet的init()方法,该方法只会在第一次访问servlet时被调用一次
  4. 服务:调用servlet的service()方法,一般业务逻辑在这里处理,该方法在访问该servlet时,会被调用
  5. 销毁:调用servlet的destroy()方法,销毁该servlet实例,该方法在以下情况被调用:   1)tomcat重新启动     2)reload该webapps     3)重新启动电脑

servlet的几个方法:

  1. init()
  2. getServletConfig()
  3. service()
  4. getServletInfo()
  5. destroy()

开发servlet有三种方法:

  1. 实现 Servlet 接口
  2. 继承 GenericServlet 类
  3. 继承 HttpServlet 方法

使用HttpServlet来开发servlet

需要重写doGet()与doPost()方法,这种方法是最常用的方法之一

表单提交数据get请求与post请求的区别

  1. 安全方面,get<post,因为get方法提交的数据会在浏览器地址栏显示,例如用户名密码等敏感信息
  2. 可提交数据大小方面,get<post,get不能大于2K,post建议不大于64K否则会影响服务器性能
  3. 请求相应速度方面,get>post,get请求会立即处理,post可能会形成队列请求

servlet的几个常用对象

request

request.getParameter("表单中的参数名");用来获取表单中的名字或Get请求路径后的参数名

request.getContextPath();用来获取上下文根目录例如:/web01

request.getRequestURL();  获取http://127.0.0.1:8080/web01/city

request.getRequestURI(); 获取 /web01/city

request.getServletPath() 获取 /city

response

response.sendRedirect(request.getContextPath+"跳转路径");服务器跳转

response.getOutoutstram();获取输出流

cookie

Cookie 用于存储 web 页面的用户信息

cookie的原理:

客户端请求服务器时,如果服务器需要记录该用户状态,就使用response向客户端浏览器颁发一个Cookie。而客户端浏览器会把Cookie保存起来。当浏览器再请求服务器时,浏览器把请求的网址连同该Cookie一同提交给服务器。服务器通过检查该Cookie来获取用户状态。

Cookie cookie = new Cookie("name","westos");新建一个名为name值为westos的cookie

设置cookie过期时间:cookie.setMaxAge(1000);

设置值允许服务器读取:cookie.setHttpOnly(true);

response.addCookie(cookie);向服务器添加cookie

session

服务器可以为每个用户浏览器创建一个会话对象(session对象),注意:一个对象在一个浏览器中只拥有一个session对象(默认情况下),session不能夸浏览器共享。因此,在需要保存用户数据时,服务器程序可以把用户数据写到用户浏览器独有的session中,当用户使用浏览器访问其它程序时,其它程序可以从用户的session中取出该用户的数据,为用户服务。

在同一个浏览器中的不同标签页中是一样的,默认保存30分钟,在有效期间,session在同一个会话,同一个项目,不同的一面之间都是共享的。

session与cookie的区别:

  • Cookie是把用户的数据写给用户的浏览器
  • Session把用户的数据写到用户独有的session中
  • Session对象由服务器创建,开发人员可以调用request对象的getSession方法得到Httpsession对象

获取session:HttpSession  session = request.getSessoin();

设置session的值:session.setAtribute("对象名","对象值");

删除session的值:session.getAtribute("对象名");

获取session的ID:session.getId();

使当前session失效:session.invalidate();

是否是新的session:session.isNew();

servletContext

WEB容器在启动时,它会为每个WEB应用程序都创建一个对应的ServletContext对象,它代表当前web应用,生命周期从创建开始,到服务器关闭结束,由于ServletContext会长时间保存在服务器中,会占用内存,所以不建议向ServletContext中添加过大的数据。

用一幅图来理解cookie,session,servletContext的关系与区别

方法:

获取实例:ServletContext sc= getServletContext();

添加属性:sc.setAtribute(String name,Object value);

获取值:sc.getAtribute(String name);

删除属性:sc.removeAreibute(String name);

下面写一个基于servlet与html页面实现的登录验证

servlet部分

验证码的servlet

package com.westos.denglu.sevlet;

import org.apache.commons.lang3.RandomUtils;
import javax.imageio.ImageIO;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.IOException;

public class YanzhengmaServlet extends HttpServlet {
    private static final int WIDTH = 100;
    private static final int HEIGHT = 40;

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request,response);
    }

    protected void doGet(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException {

        HttpSession session = request.getSession();

        //制作一张验证码图片,格式为jpg
        BufferedImage image = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_RGB);
        Graphics g = image.getGraphics();
        //设置背景色
        g.setColor(Color.WHITE);
        //填充背景色
        g.fillRect(0,0,WIDTH,HEIGHT);
        //设置前景色
        g.setColor(Color.RED);
        //设置字体
        Font font=new Font("仿宋",Font.BOLD,20);
        g.setFont(font);
        //获取4位随机字母
        String randomString = getRandomString(4);
        session.setAttribute("ranstr",randomString);
        g.drawString(randomString,20,30);
        //设置干扰线
        for(int i=0;i<20;i++){
            int x1 = RandomUtils.nextInt(0,WIDTH);
            int x2 = RandomUtils.nextInt(0,WIDTH);
            int y1 = RandomUtils.nextInt(0,HEIGHT);
            int y2 = RandomUtils.nextInt(0,HEIGHT);
            Color color = new Color(RandomUtils.nextInt(0,255),RandomUtils.nextInt(0,255),RandomUtils.nextInt(0,255));
            g.setColor(color);
            g.drawLine(x1,x2,y1,y2);
        }

        ImageIO.write(image,"jpg",response.getOutputStream());
        //response.getWriter().print("success");
    }
    //获取len个随机字母
    private String getRandomString(int len){
        String result = "";
        for(int i=0;i<len;i++){
            char c = (char) RandomUtils.nextInt(65, 91);
            result = result+c;
        }

        return result;
    }
}

登录的servlet

package com.westos.denglu.sevlet;

import org.apache.commons.lang3.StringUtils;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
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 {
        request.setCharacterEncoding("utf-8");
        response.setContentType("text/html;charset=utf-8");
        response.setCharacterEncoding("utf-8");

        HttpSession session = request.getSession();
        String str = (String) session.getAttribute("ranstr");
        if (StringUtils.equalsIgnoreCase(request.getParameter("username"), "周雄") && StringUtils.equalsIgnoreCase(request.getParameter("password"), "123456") && StringUtils.equalsIgnoreCase(request.getParameter("yanzhengma"), str)) {

            response.getWriter().println("用户名是:" + request.getParameter("username"));
            response.getWriter().println("登录密码是" + request.getParameter("password"));
            response.getWriter().println("验证码是" + session.getAttribute("ranstr"));

        } else if (!StringUtils.equalsIgnoreCase(request.getParameter("username"), "周雄") || !StringUtils.equalsIgnoreCase(request.getParameter("password"), "123456")) {

            response.getWriter().println("用户名或密码错误");
            response.getWriter().println("请重新 <a href=\"/DengLu/login.html\" >登录</a>");

        } else if (request.getParameter("yanzhengma") != str) {

            response.getWriter().println("验证码错误");
            response.getWriter().println("请重新 <a href=\"/DengLu/login.html\" >登录</a>");
        }

    }

}

 

html页面部分

默认jsp页面

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
  <head>
    <title>welcome</title>
  </head>
  <body>
  Welcome!
  <a href="/DengLu/login.html" >点击登录</a>
  </body>
</html>

登录login.html页面

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>登录页面</title>
</head>
<body>
    <form name="form1" method="post" action="login">
        <input type="text" name="username" placeholder="请输入用户名"/>
        <input type="password" name="password" placeholder="请输入密码"/>
        <img src="./yzm">
        <input typr="text" name="yanzhengma" placeholder="请输入图片中的验证码"/>
        <button type="submit">登录</button>
    </form>
</body>
</html>

登录错误error.html页面

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>错误页面</title>
</head>
<body>
    请重新 <a href="/DengLu/login.html" >登录</a>

</body>
</html>

测试效果为

index.jsp

login.html

erroe.html

 

 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值