Servlet编程入门

Servlet 是运行在 Web 服务器或应用服务器上的程序,它是作为来自 Web 浏览器或其他 HTTP 客户端的请求和 HTTP 服务器上的数据库或应用程序之间的中间层。

在这里插入图片描述

**

1.1 什么是Servlet?(JSP = Servlet + HTML)

**
Servlet是JavaWeb的三(Servlet(控制器)、Filter(过滤器)、Listener(监听器))大组件之一,它属于动态资源。Servlet的作用是处理请求,服务器会把接收到的请求交给Servlet来处理,在Servlet中通常需要:
① 接收请求数据;
② 处理请求;
③ 完成响应。
例如客户端发出登录请求,或者输出注册请求,这些请求都应该由Servlet来完成处理!Servlet需要我们自己来编写,每个Servlet必须实现javax.servlet.Servlet接口。

在这里插入图片描述

**

1.2 实现Servlet有三种方式

**
① 实现javax.servlet.Servlet接口;
② 继承javax.servlet.GenericServlet类;
③ 继承javax.servlet.http.HttpServlet类;
通常我们会去继承HttpServlet类来完成我们的Servlet,但学习Servlet还要从javax.servlet.Servlet接口开始学习。

问题:有人就要问了,为什么开发Servlet有三种方法?
回答:应为Servlet这个技术不是一开始出现就那么成熟,他经历一个发展的阶段。
Servlet --> GenericServlet --> HttpServlet

request.getAttribute()和request.getParameter()区别

重定向和页面转发;重定向不能定向到WEB-INF下的jsp中
页面转发req.getRequestDispatcher()可以通过路径访问WEB-INF下的jsp保护文件。


1.用途上:

request.getAttribute(), 一般用于获取request域对象的数据(在跳转之前把数据使用setAttribute来放到request对象上)
request.getParameter(), 一般用于获取客户端提交的参数

2.存储数据上:

request.getAttribute()可以获取Objcet对象
request.getParameter()只能获取字符串(这也是为什么它一般用于获取客户端提交的参数)

forward和redirect的区别

实际发生位置不同,地址栏不同

(1).转发是发生在服务器的

转发是由服务器进行跳转的,细心的朋友会发现,在转发的时候,浏览器的地址栏是没有发生变化的,在我访问Servlet111的时候,即使跳转到了Servlet222的页面,浏览器的地址还是Servlet111的。也就是说浏览器是不知道该跳转的动作,转发是对浏览器透明的。通过上面的转发时序图我们也可以发现,实现转发只是一次的http请求,一次转发中request和response对象都是同一个。这也解释了,为什么可以使用request作为域对象进行Servlet之间的通讯。

(2).重定向是发生在浏览器的

重定向是由浏览器进行跳转的,进行重定向跳转的时候,浏览器的地址会发生变化的。曾经介绍过:实现重定向的原理是由response的状态码和Location头组合而实现的。这是由浏览器进行的页面跳转实现重定向会发出两个http请求,request域对象是无效的,因为它不是同一个request对象

3.用法不同:

很多人都搞不清楚转发和重定向的时候,资源地址究竟怎么写。有的时候要把应用名写上,有的时候不用把应用名写上。很容易把人搞晕。记住一个原则: 给服务器用的直接从资源名开始写,给浏览器用的要把应用名写上

request.getRequestDispatcher("/资源名 URI").forward(request,response)

转发时"/"代表的是本应用程序的根目录【zhongfucheng】

response.send("/web应用/资源名 URI");

重定向时"/"代表的是webapps目录

4.能够去往的URL的范围不一样:

转发是服务器跳转只能去往当前web应用的资源
重定向是服务器跳转,可以去往任何的资源

5.传递数据的类型不同

转发的request对象可以传递各种类型的数据,包括对象
重定向只能传递字符串

6.跳转的时间不同

转发时:执行到跳转语句时就会立刻跳转
重定向:整个页面执行完之后才执行跳转

那么转发(forward)和重定向(redirect)使用哪一个?

根据上面说明了转发和重定向的区别也可以很容易概括出来。转发是带着转发前的请求的参数的。重定向是新的请求。

7.典型的应用场景:

转发: 访问 Servlet 处理业务逻辑,然后 forward 到 jsp 显示处理结果,浏览器里 URL 不变
重定向: 提交表单,处理成功后 redirect 到另一个 jsp,防止表单重复提交,浏览器里 URL 变了

**

Servlet生命周期

**
Servlet部署在容器里(应用服务器Tomcat,其他应用服务器,比如jboss,weblogic…),它的生命周期由容器来管理。
Servlet的生命周期分为以下几个阶段:(重点)
1.装载Servlet,由相应的Tomcat容器来完成
2.创建一个Servlet实例
3.调用Servlet的init()方法,该方法只会在第一次访问Servlet时被调用一次
4.服务:调用Servlet的service()方法,一般业务逻辑在这里处理,该方法在访问该Servlet时,会被调用
5.销毁:调用Servlet的destroy()方法,销毁该Servlet实例,该方法在以下情况被调用:
a.tomcat重新启动
b.reload该webapps
c.重新启动电脑

在这里插入图片描述

在这里插入图片描述

一个简单的登录系统测试Servlet

HTML

<div align="center">
	<h1>首页</h1>
	<hr>
	<form action="servlet4" method="post">
		<table>
			<tr>
				<td>用户名:</td>
				<td><input type="text" name="userName"></td>
			</tr>
			<tr>
				<td>密码:</td>
				<td><input type="password" name="password"></td>
			</tr>
			<tr>
				<td><input type="submit" value="登录"></td>
				<td><input type="reset" value="重置"></td>
			</tr>
		</table>
		</form>
</div>

Servlet

    public class Servlet4 extends HttpServlet {
@Override
public void init() throws ServletException {
	System.out.println("---init()---");
}

@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
		throws ServletException, IOException {
	// 1、接收数据
	String userName = request.getParameter("userName");
	String password = request.getParameter("password");
	System.out.println("---------" + userName);
	System.out.println("=========" + password);
	if (userName.equals("admin")) {
		// 正确
		// 3、跳转页面
		response.sendRedirect("view/mian.jsp");
	} else {
		// 错误
		// 3、跳转页面
		response.sendRedirect("login.jsp");
	}
	// 2、调用业务
	// ?
}

@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
		throws ServletException, IOException {
	System.out.println("--------doPost-----------");
	this.doGet(request, response);
    }
 }

WEB XML配置

<servlet>
	<servlet-name>servlet4(Servlet的文件名)</servlet-name>
	<servlet-class>com.hqyj.servlet.test.Servlet4(Servlet的路径)</servlet-class>
	<load-on-startup>0</load-on-startup>
</servlet>
<servlet-mapping>
	<servlet-name>servlet4(要与上文Servlet的name一致)</servlet-name>
	<url-pattern>/servlet4</url-pattern>
</servlet-mapping>
<welcome-file-list>
	<welcome-file>login.jsp(配置文件入口)</welcome-file>
</welcome-file-list>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值