<仅供个人复习使用>
1.概述
- Servlet(Servler Applet)是Java Web应用的基础技术,也是JSP实现的基础。
- Servlet 是一个Java 程序,是在服务器上运行以处理客户端请求并做出相应的程序。
2.Servlet编程基础
Servlet(Servler Applet)必须继承Servlet类或它的子类,通常继承HTTPServlet。
2.1创建Servlet程序
- 创建Web project:–ServletProject
- 创建Package:–src下创建com.home.servlet
- 创建Servlet:–FirstServlet
2.2 配置Servlet
- 配置:—通过配置文件-web.xml 或 通过注解
2.3 Servlet运行机制
- Servlet 第一次被调用时,服务器将创建Servlet的一个实例,并且运行此实例。若已经实例化,则服务器会启动一个线程运行实例。
- 第一个实例会驻留在内存中
- Servlet是Java中特殊的类,没有main()方法。不能直接运行,放在Servlet容器中才能运行,
2.4 HTTPServlet中的方法
- 处理HTTP协议的请求和响应
doGet()和doPost()方法
doGet()---以Get请求服务时调用
doPost()---以Post请求服务时调用
init()----负责初始化Servlet对象,只执行一次
service()---负责响应客户的请求
destory()---资源释放
2.5 Servlet 生命周期
3.利用Servlet读取HTML表单数据
3.1客户端传递数据的方式
- 两种方式:表单方式 和 数据附在URL后面
举例:
index.html
<body>
<form action="LoginServlet" method="Post">
<input type="text" id="username" name="username">
<input type="password" id="password" name="password">
<input type="submit" value="提交">
</form>
</body>
LoginServlet
@WebServlet("/LoginServlet")
public class LoginServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
public LoginServlet() {
super();
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String username = request.getParameter("username");
System.out.println(username);
}
}
Server 上运行:
提交到LoginServlet,并在控制台打印username:
上例为Post提交,若用get提交:
3.2 在Servlet中读取客户端发送的数据
- HTTPServletRequest:包含客户端请求信息
- HTTPServletResponse:处理响应信息
通过HTTPServletRequest中的方法:
- getParameter()获得对应参数名的值
eg: String username = request.getParameter(“username”) - 获得多个值:getParameterValues()
eg:String[] data = request.getParameterValue(“name”)
中文乱码问题:
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 前端是utf-8编码时,接收也要是utf-8
request.setCharacterEncoding("utf-8");//解决中文乱码问题
String username = request.getParameter("username");
String password = request.getParameter("password");
response.setContentType("text/html;charSet=utf-8");
PrintWriter out = response.getWriter();//获得输出流
out.print("接收到的用户名:"+username);
out.print("接收到的密码:"+password);
out.flush();//只刷新缓存,缓存到一定比例会进行写入数据
out.close();//输出流用完close,刷新缓存
}
4.处理HTTP报头
HTTP会在请求和响应时,加上一些附加信息,这些信息就是HTTP请求报头和响应报头。
在Servlet,可以获得请求报头信息,或者设置响应报头的信息。
4.1 在Servlet中获得HTTP请求报头
通过HTTPServletRequest的getHeader(String headerName)方法和获得对应的请求报头。
其他方法:
getHeaderNames()
getHeaders()
getDataHeader()
getIntHeader()
4.2 在Servlet中设置HTTP响应报头
通过HTTPServletResponse的setHeader()方法来设置HTTP响应报头信息。
格式: setHeader(String headerName,String headerValue)
4.3 在Servlet中跳转到其他页面
跳转实现方式:
- 请求重定向:
HttpServletResponse.sendRedirect(String url)
***跳转之前所存储的所有的请求属性会清空***
// sendRedirect 方式:
response.sendRedirect("Login.html");
response.sendRedirect("http://www.qq.com");
- 请求转发:
RequestDispatcher对象.forward(request,response)
***将封装在参数中的属性传递到跳转的页面***
// forward方式:
RequestDispatcher = request.getRequestDispatcher(url);
// 参数url是欲转发的页面或者Servlet的URL地址
dispatcher.forward(request,response);
应用举例:
input.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<!-- 提交一个整数,Servlet接收数据之后判断合法性【10,500】,
合法转到新的Servlet计算平方值,否则跳转到当前页面 -->
<form action="Verify" method="post">
请输入要计算平方值的整型数据:<input type="text" id="number" name="number" />
<input type="submit" value="计算">
</form>
</body>
</html>
package com.tjut.servlet;
import java.io.IOException;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/Verify")
public class Verify extends HttpServlet {
private static final long serialVersionUID = 1L;
public Verify() {
super();
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String number=request.getParameter("number");
try {
int n = Integer.parseInt(number);
if (n<10 || n>500) { //数据非法,重定向到当前页面
response.sendRedirect("input.html");
}else {
RequestDispatcher dispatcher = request.getRequestDispatcher("compute");
request.setAttribute("temp", "测试转发的request数据是否保留");// 测试:
dispatcher.forward(request, response);//转发,保留原有request值
}
} catch (Exception e) { //异常:重新转发到当前页面
response.sendRedirect("input.html");
}
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
package com.tjut.servlet;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/compute")
public class compute extends HttpServlet {
private static final long serialVersionUID = 1L;
public compute() {
super();
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String number = request.getParameter("number");//1.获得number值
String temp = (String)request.getAttribute("temp");//测试:要String类型-转换一下
int n = Integer.parseInt(number);//2.转换整型数据
//response.setCharacterEncoding("utf-8");//3.支持中文
response.setContentType("text/html;charset=utf-8");//输出给浏览器的是以html的文档类型
PrintWriter out = response.getWriter();//4.获得向请求方发送数据的输出流
out.print(number + "的平方值为:" + n*n);//5.计算
out.print("<br>" + temp + ":确实保留了");
out.close();//6.释放
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
PS:可把接收和返回数据进行封装处理
5. Servlet中文问题
- response设置:在获得输出流之前设置编码方式
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String number = request.getParameter("number");
response.setContentType("text/html;charset=utf-8");//输出给浏览器的是以html的文档类型
PrintWriter out = response.getWriter();
......
out.close();
}
- request 设置:
request.setCharacterEncoding("utf-8");
6. 处理Cookie
概述:
Cookie是一小段的文本,通过CGI、ASP、JSP、Servlet等程序,可以将Cookie保存到浏览器所在的客户端的内存或磁盘上。
作用:
1)记录用户事件
2)浏览历史记录
3)用户名和密码的记录
...
Cookie中文问题:
cookie不支持中文,需要重新编码
-保存时编码:
username=java.net.URLEncoder.encode(username,"utf-8");
-获取时解码:
username=java.net.URLDecoder.decode(userName,"utf-8");
7. 会话跟踪-Session
7.1 会话的意义和用途-cookie和session
(1) cookie数据存放在客户的浏览器上,session数据放在服务器上。
(2) cookie不是很安全,别人可以分析存放在本地的cookie并进行cookie
欺骗,考虑到安全应当使用session。
(3) session在一定时间内保存在服务器上。当访问增多,会比较占用你
服务器的性能,考虑到减轻服务器性能方面,应当使用cookie 。
(4) 单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多
保存20个cookie。
7.2 Servlet中操作Session对象
Session是实现接口:javax.servlet.http.HttpSession的对象。可通过如下语句获得:
HttpSession s=request.getSession(); request是HttpServletRequest对象
HttpSession中常用的方法:
(1) getAttribute(String name):
(2) setAttribute(String name,Object value):
7.3 实例
Session 读取实例:
8.ServletContext接口
ServletContext指Servlet的运行容器。可以将一些共享信息保存在Servlet Context中。
常见的操作:
String getRealPath(String path):
void setAttribute(String name,Object value):
Object getAttribute(String name):
void removeAttribute(String name):
String getInitParameter(String name):
共享信息:
PS:使用Tomcat时端口占用问题
cmd
C:\WINDOWS\system32>netstat -ano | findstr 0.0:8800
TCP 0.0.0.0:8800 0.0.0.0:0 LISTENING 5928
C:\WINDOWS\system32>taskkill /F /PID 5928
成功: 已终止 PID 为 5928 的进程。