【Web学习笔记】Java Servlet 编程

<仅供个人复习使用>

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中的方法:

  1. getParameter()获得对应参数名的值
    eg: String username = request.getParameter(“username”)
  2. 获得多个值: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中跳转到其他页面

跳转实现方式:

  1. 请求重定向:
 HttpServletResponse.sendRedirect(String url)
 ***跳转之前所存储的所有的请求属性会清空***
// sendRedirect 方式:
response.sendRedirect("Login.html");
response.sendRedirect("http://www.qq.com");
  1. 请求转发:
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 的进程。
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值