Servlet学习之路(1)

什么是Servlet?

Servlet是基于Java语言的Web语言的Web服务器端编程技术,它是运行在Servlet容器中的Java类,它能处理Web客户的HTTP请求,并产生HTTP响应。

Servlet对Request的处理和Response过程分为

  • 接受HTTP请求
  • 取得请求信息,包括请求头和请求参数数据
  • 调用其他Java类方法,完成具体的业务功能
  • 实现到其他Web组件的跳转(包括重定向和请求转发)
  • 生成HTTP响应(包括HTML或非HTML响应)

Servlet容器

Servlet运行在服务器端,由Servlet容器所管理,Servlet容器也叫Servlet引擎,是Web服务器或应用程序的一部分,用于在发送的请求和响应之上提供网络服务、解码基于MIME的请求、格式化基于MIME的响应。

创建第一个Servlet实例

创建步骤

  • Servlet创建之前应该先配置好tomcat服务器(网上有免安装版的,下载一个即可)
  • 创建好动态Web项目(Dynamic Web Project)(建议使用MyEclipse或Idea),别忘了勾选web.xml文件。
  • 剩下的和编写Java的时候很想,不过是从创建Class,变成了创建Servlet
  • 如果使用的是MyEclipse,创建Servlet时,doGet()和doPost()就已经写好了
package cn.sdut.servlet;

import java.io.IOException;
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("/FirstServlet")//注解方式,Servlet3以上版本可使用,对应Tomcat7以上
public class FirstServlet extends HttpServlet {

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.getWriter().append("Served at: ").append(request.getContextPath());
	}

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

}

什么都不用写,编译器已经帮我们写好了,运行试试。

Servlet体系结构

Servlet的主要接口和类之间的关系

Servlet接口

Servlet接口规定了必须由Servlet类实现并且由Servlet引擎识别和管理的方法集;

Servlet接口的基本目标是提供与Servlet生命周期相关的方法,如:init()、service()和destory()等。

方法名称方法描述
init(ServletConfig config)Servlet初始化方法,在Servlet实例化后,容器调用该方法进行Servlet的初始化,init()方法只能被调用一次,如果此方法没有正常结束,就会抛出一个ServletException,一旦抛出该异常,Servlet将不在执行,随后对其进行再次调用,容器会重新载入并再次运行init()方法。
service(ServletRequest req,ServletResponse resp)Servlet的服务方法,当用户对Servlet发出请求时容器会调用该方法处理用户的请求
destroy()Servlet的销毁方法,容器在终止Servlet服务前调用此方法,容器调用此方法前必须给service()线程足够的时间来结束执行,因此接口规定当service()正在执行时,destory()不被执行
getServletConfig()此方法可以让Servlet在任何时候获得ServletConfig对象
getServletInfo()此方法返回一个String对象,该对象包含Servlet的信息,如:开发者、创建日期、描述信息等。该方法可用于容器

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

GenericServlet抽象类

GenericServlet概述

  • GenericServlet是一个通用的协议无关的Servlet,它实现了Servlet和ServletConfig接口。
  • 继承自GenericServlet的Servlet应该要覆盖service()方法。

GenericServlet的常用方法

方法名称功能描述
public void init(ServletConfig config)调用Servlet接口中的init()方法。此方法还有一无参的重载方法,其功能与此方法相同
public String getInitParameter(String name)返回名称为nam的初始化参数的值
public ServletContext getServletContext()返回ServletContext对象的引用

 

 

 

 

 

HttpServlet抽象类

HttpServlet指能够处理HTTP请求的Servlet,它在原有Servlet接口上添加了对HTTP协议的处理,它比Servlet接口的功能更为强大。

HttpServlet类中的主要方法及描述:

方法方法描述
service(HttpServletRequestreq,HttpServletResponserespHttpServlet在实现Servlet接口时,重写了service()方法,该方法会自动判断用户的请求方式;若为GET请求,则调用HttpServlet的doGet()方法;若为POST请求,则调用doPost()方法。因此,开发人员在编写Servlet时,通常只需要重写doGet()或doPost()方法,而不要去重写service方法。如果Servlet收到一个HTTP请求而你没有重载相应的do方法,它就返回一个说明此方法对本资源不可用的标准HTTP错误。
doGet(HttpServletRequestreq,HttpServletResponseresp)此方法被本类的service()方法调用,用来处理一个HTTPGET操作。
doPost(HttpServletRequestreq,HttpServletResponseresp)此方法被本类的service()方法调用,用来处理一个HTTPPOST操作。

 

 

 

 

 

 

 

HttpServlet作为HTTP请求的分发器,除了提供对GET和POST请求的处理外,对于其他请求类型也提供了相应的处理方法(如:doHead()、doOptions()、doDelete()、doPut()、doTrace())。

测试

1.编写一个Servlet,当用户请求该Servlet时,显示用户于哪年那月几点几分从哪个IP(InternetProtocol)地址连接至服务器。

package cn.sdut.servlet;

import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;

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("/CountServlet")
public class CountServlet extends HttpServlet {

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.setContentType("text/html;charset=UTF-8");
		Date date = new Date(); 
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");//可以方便地修改日期格式
		String curdate = sdf.format(date); 
		response.getWriter().append(curdate).append("用户从ip地址").append(request.getRemoteAddr()).append("连接至服务器");
		response.getWriter().write("<br>"+"请求用户的主机名:"+request.getRemoteHost());
		response.getWriter().write("<br>"+"请求用户的主机使用的网络端口号:"+request.getRemotePort());
		response.getWriter().write("<br>"+"web服务器的ip地址:"+request.getLocalAddr());
		response.getWriter().write("<br>"+"web服务器的主机名:"+request.getServerName());
		response.getWriter().write("<br>"+"web服务器的的网络端口号:"+request.getServerPort());
		response.getWriter().write("<br>"+"使用的协议"+request.getProtocol());
		response.getWriter().write("<br>"+"请求的url地址"+request.getRequestURL());


	}

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

}

Servlet声明配置

  • 在web.xml中配置
  • 注解配置

Servlet基本应用

处理超链接请求数据

 

处理Form表单请求数据

  • Form表单在enctype属性缺省或取值为application/x-www-form-urlencoded情况下,无论是Get请求类型还是Post请求类型,均通过HttpServletRequest对象来获取请求数据。
  • 超链接一般用于获取/查询资源信息,属于GET请求类型,请求的数据会附在URL之后,以?分割URL和传输数据,参数之间以&相连。由于其安全性(如:请求数据会以明文显示在地址栏上)以及请求地址的长度限制,一般仅用于传送一些简单的数据;
  • Form表单一般用于更新资源信息,默认使用GET请求类型,多使用POST请求类型。由于POST请求类型理论上没有数据大小限制,可用表单来传较大量的数据;

示例代码

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>用户登录</title>
</head>
<body>
	<form action="LoginServlet" method="post">
		用户名:<input type="text" name="user">
		密   码 :<input type="password" name="pwd">
		<br>
		期望城市:
		<input type="checkbox" name="cities" value="qingdao">青岛
		<input type="checkbox" name="cities" value="beijing">北京
		<input type="checkbox" name="cities" value="shanghai">上海
		<input type="checkbox" name="cities" value="guangzhou">广州		
		<input type="submit" value="登录" >
		<br>
		
	</form>
</body>
</html>
package servlet;

import java.io.IOException;
import java.util.Arrays;

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("/LoginServlet")
public class LoginServlet extends HttpServlet {
	
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.setContentType("text/html;charset=UTF-8");//响应头中文不乱码(网页中)
		request.setCharacterEncoding("utf-8");//请求头中文不乱码,(数据库中)
		String uname = request.getParameter("user");
		String pwd = request.getParameter("pwd");
		String[] city = request.getParameterValues("cities");
		System.out.println(uname+pwd+Arrays.toString(city));
		if(uname.equals(pwd)) {
			response.getWriter().append(uname+"登陆成功!").append(Arrays.toString(city));
		}else {
			response.getWriter().append(uname+"登陆失败!");
		}
//		RequestDispatcher dispatcher = request.getRequestDispatcher("MainSerlvet");
//		dispatcher.forward(request, response);
	}

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

}

请求转发和重定向

请求转发

请求转发是指将请求再转发到其他地址,转发过程中使用的是同一个request请求,转发后浏览器地址栏内容不变。

更改一下代码,html不变

package servlet;

import java.io.IOException;
import java.util.Arrays;

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("/LoginServlet")
public class LoginServlet extends HttpServlet {
	
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//		response.setContentType("text/html;charset=UTF-8");//响应头中文不乱码(网页中)
//		request.setCharacterEncoding("utf-8");//请求头中文不乱码,(数据库中)
//		String uname = request.getParameter("user");
//		String pwd = request.getParameter("pwd");
//		String[] city = request.getParameterValues("cities");
//		System.out.println(uname+pwd+Arrays.toString(city));
//		if(uname.equals(pwd)) {
//			response.getWriter().append(uname+"登陆成功!").append(Arrays.toString(city));
//		}else {
//			response.getWriter().append(uname+"登陆失败!");
//		}
		RequestDispatcher dispatcher = request.getRequestDispatcher("MainSerlvet");
		dispatcher.forward(request, response);
	}

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

}

在写一下MainServlet

package servlet;

import java.io.IOException;
import java.util.Arrays;

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("/MainServlet")
public class MainServlet extends HttpServlet {       



	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.setContentType("text/html;charset=UTF-8");//响应头中文不乱码(网页中)
		request.setCharacterEncoding("utf-8");//强求头中文不乱码,(数据库中)
		String uname = request.getParameter("user");
		String pwd = request.getParameter("pwd");
		String[] city = request.getParameterValues("cities");
		System.out.println(uname+pwd+Arrays.toString(city));
		if(uname.equals(pwd)) {
			response.getWriter().append(uname+"登陆成功!").append(Arrays.toString(city));
		}else {
			response.getWriter().append(uname+"登陆失败!");
		}
	}

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

}

 效果一样,url依然为LoginServlet

重定向

重定向通过HttpServletResponse对象的sendRedirect()方法实现,该方法会通知客户端去重新访问新指定的URL地址。

sendRedirect()方法不仅可以重定向到当前应用程序中的其他资源,还可以重定向到同一个站点上的其他应用程序中的资源,甚至是使用绝对URL重定向到其他站点的资源。

package servlet;

import java.io.IOException;

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("/LoginRedirectServlet")
public class LoginRedirectServlet extends HttpServlet {
	
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

		response.sendRedirect("https://blog.csdn.net/qq_40657585/article/details/100981472");//重定向到站外
	}

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

}

Servlet核心接口

Servlet几个重要的接口简介:

  • ServletConfig接口:用于获取Servlet初始化参数和ServletContext对象;
  • ServletContext接口:代表当前Servlet运行环境,Servlet可以通过ServletContext对象来访问Servlet容器中的各种资源;
  • HttpServletRequest接口:用于封装HTTP请求信息;
  • HttpServletResponse接口:用于封装HTTP响应消息。

ServletConfig接口

javax.servlet.ServletConfig接口的定义为:

  • publicabstractinterfacejavax.servlet.ServletConfig
  • 容器在初始化一个Servlet时,将为该Servlet创建一个唯一的ServletConfig对象,并将这个ServletConfig对象通过init(ServletConfigconfig)方法传递并保存在此Servlet对象中。

在容器对Servlet进行初始化时,会创建一个SerlvetConfig对象,传入到init方法中,保存在Servlet对象中

常用方法

  • getInitParameter(String name) 根据初始化参数名读取初始化参数值
  • getServeltContext() 获取servlet的设备上下文对象

ServletConext接口

Servlet的上下文,代表servlet的运行环境,是servlet与容器进行通信的接口,web容器中,一个项目所有的servlet共享同一个servletcontext对象。

获取应用范围内的初始化参数(所有的servlet都可以获取到的初始化参数在web.xml中使用<context-param>配置的初始化参数)

1、在web.xml中使用<context-param>

<context-param>

      <param-name>myname</param-name>

      <param-value>jiangweijie</param-value>

</context-param>

2、在本项目的任意一个Servlet中都可以获取该参数的值

首先获取ServletContext,有两种方法:

  1. 使用ServletConfig对象中的getServletContext()方法
  2. 直接使用getServletContext()方法

然后使用ServletContext对象的getInitParameter(string name)方法获取应用的初始化参数值。

设置和获取应用域的属性值

  • setAtrribute(name,value) 将名为name值为value属性加入到应用域中
  • getAttribute(name) 从应用域中获取名字为name的属性值
  • removeAttribute(name) 从应用域中删除名为name的属性

注意:应用域中的属性,本项目中的所有的servlet都可以操作(读,改,删除)

 

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值