servlet
Java Servlet 是运行在 Web 服务器或应用服务器上的程序,它是作为来自 Web 浏览器或其他 HTTP 客户端的请求和 HTTP 服务器上的数据库或应用程序之间的中间层,使用 Servlet,可以收集来自网页表单的用户输入,呈现来自数据库或者其他源的记录,还可以动态创建网页。
servlet的几个特点:
- 由服务器调用和执行
- 使用Java语言编写
- 按照servlet规范开发
- 功能强大,几乎可以完成所有的网站功能
- 是jsp 的基础
servlet的体系结构
servlet的生命周期
- 装载servlet,由相应的容器来完成
- .创建一个servlet实例
- 调用servlet的init()方法,该方法只会在第一次访问servlet时被调用一次
- 服务:调用servlet的service()方法,一般业务逻辑在这里处理,该方法在访问该servlet时,会被调用
- 销毁:调用servlet的destroy()方法,销毁该servlet实例,该方法在以下情况被调用: 1)tomcat重新启动 2)reload该webapps 3)重新启动电脑
servlet的几个方法:
- init()
- getServletConfig()
- service()
- getServletInfo()
- destroy()
开发servlet有三种方法:
- 实现 Servlet 接口
- 继承 GenericServlet 类
- 继承 HttpServlet 方法
使用HttpServlet来开发servlet
需要重写doGet()与doPost()方法,这种方法是最常用的方法之一
表单提交数据get请求与post请求的区别
- 安全方面,get<post,因为get方法提交的数据会在浏览器地址栏显示,例如用户名密码等敏感信息
- 可提交数据大小方面,get<post,get不能大于2K,post建议不大于64K否则会影响服务器性能
- 请求相应速度方面,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