一、Servlet相关知识
1.什么是Servlet?
Servlet(Server Applet)是Java Servlet的简称,称为小服务程序或服务连接器,用Java编写的服务器端程序,具有独立于平台和协议的特性,主要功能在于交互式地浏览和生成数据,生成动态Web内容。
狭义的Servlet是指Java语言实现的一个接口,广义的Servlet是指任何实现了这个Servlet接口的类,一般情况下,人们将Servlet理解为后者
2.Servlet的生命周期
①客户端请求Servlet,加载Servlet类到内存
②实例化:调用Servlet的构造器创建一个具体的Servlet对象的过程
③调用init()方法初始化该 Servlet
ps:第二和第三步是在第一次访问的时候创建servlet程序会调用
④执行service()方法(根据请求方法不同调用doGet() 或者 doPost(),此外还有doHead()、doPut()、doTrace()、doDelete()、doOptions()、destroy())。
ps:第四步,每次访问都会调用
⑤加载和实例化 Servlet。
ps:这项操作一般是动态执行的。
⑥执行destroy()销毁方法
ps:第六步,在web工程停止的时候调用
如图所示:
3.分发请求
get->doGet
post->doPost
4.servlet加载
默认:1 (当访问时 ,第一次加载)
0(>=0) tomcat启动就加载
5.HttpServlet
- 在我们创建一个Servlet类后我们会继承HttpServlet类。
- 查看HttpServlet源码可知道,HttpServlet继承GenericServlet。
- 因为GenericServlet是抽象类,所以HttpServlet也是抽象类。
6.ServletRequest接口
doGet()和doPost()方法参数类型是HttpServletRequest,HttpServletResponse,分别实现ServletRequest,ServletResponse这两个接口
接收请求参数
- getParameter(String p)
- getParameterValues(String p)(当一个参数名对应多个参数值)
传递属性值
- ${msg}
<% String msg = (String) request.getAttribute("msg"); %>
7.HttpServletResponse对象
响应数据
getWriter() ------获取字节流getOutputStream() ------获取字节流,能够响应任意类型的数据
8.ServletResponse和RequestDispatcher接口
- 转发与重定向
这里主要设计转发和重定向 ,前者使用RequestDispatcher,后者使用HttpServletResponse。
- 请求转发与重定向的区别
请求转发是服务端跳转,重定向是客户端跳转
请求转发是一次请求,而重定向是两次请求
请求转发可以共享request数据,而重定向不可以
请求转发地址栏不发生任何变化,重定向地址会改变
请求转发只能跳转到当前项目下的资源,重定向可以任意资源(可跨越服务器)
- 回应字符流
PrintWriter out = resp.getWriter();
ps:写入你想要的内容之后 添加上下面的代码
out.flush();
out.close();
- 回应字节流
ServletOutputStream
api:commons-io需要去官网下载一下
https://commons.apache.org/proper/commons-io/download_io.cgi
字节流: 它处理单元为1个字节(byte),操作字节和字节数组,存储的是二进制文件,如果是音频文件、图片、歌曲,就用字节流好点(1byte = 8位);
字符流: 它处理的单元为2个字节的Unicode字符,分别操作字符、字符数组或字符串,字符流是由Java虚拟机将字节转化为2个字节的Unicode字符为单位的字符而成的,如果是关系到**中文(文本)**的,用字符流好点(1Unicode = 2字节 = 16位);
9.路径
- HttpServletRequest读取路径
req.getContextPath()
req.getServletPath()
req.getPathInfo()
- 实际站点
req.getServletContext()
req.getRealPath("/")
- 转发路径
- 重定向路径
二、简单的登入页面
- UserServlet.java
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("/login")
public class UserServlet extends HttpServlet {
/**
* 用户登入
* @param req
* @param resp
* @throws ServletException
* @throws IOException
*/
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("utf-8");
resp.setContentType("text/html;charset=utf-8");
String user = req.getParameter("Username");
String psw = req.getParameter("Password");
PrintWriter out = resp.getWriter();
if (user.equals("cracker") && psw.equals("123456")) {
resp.sendRedirect("welcome.html");
} else {
out.println("<html><head><title><title>登陆成功的页面</title></title></head><body bgcolor='orange'><a href='login.html'>重新登陆</a><h1>对不起,用户名或密码错误,请重新输入!</h1><hr></body></html>");
}
}
}
- login.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>用户登入</title>
</head>
<body>
<div style="text-align: center">
<form action="/login" method="post">
用户姓名:<input type="text" name="Uername"><br>
用户密码:<input type="password" name="Password"><br>
<input type="submit" name="提交" style="text-align: center">
</form>
</div>
</body>
</html>