Servlet介绍以及Servlet的配置

16 篇文章 0 订阅
jsp的本质就是Servlet,开发者把编写好的jsp页面部署再web容器中,web容器会将jsp编译成对应的Servlet.但直接使用Servlet的坏处是:Servlet的开发效率非常低,特别是当使用Servlet生成表现成时,页面中所有的html标签,都需要采用Servlet的输出流来输出,因此及其繁琐.
但MVC规范出现后,Servle的责任开始明确了,仅仅作为控制器使用,不再需要生成页面标签,也不再作为视图角色使用.

Servlet的开发
Servlet通常被称为服务器端小程序,是运行在服务器端的撑起,用于处理及响应客户端的请求.
Servlet是个特殊的Java类,这个java类必须继承HttpServlet.每个Sevlet可以响应客户端的请求.Servlet提供不同的方法用于响应客户端请求.
doGet:用于响应客户端的GET请求
doPoat:用于响应客户端的POST请求
doPut:用于响应客户端的doPut请求
doDelete:用于响应客户端的Delete请求
事实上,客户端的请求通常只有GET和POST两种,Servlet为了响应这两种请求,必须重写doGEt()和doPost()两个方法.上述另两个方法若需要响应,则也需要重写
大部分:servlet对于所有请求的响应都是完全一样的.此时,可以采用重写一个方法来代替上面的几个方法:只有重写service()方法即可响应客户端的所有请求/
另外,httpServlet还包含两个方法:
init(ServletConfig config) :创建Servlet实例时,调用该方法的初始化Servlet资源.
destory():销毁你Servlet实例时,自动调用该方法的回收资源.
通常无须重写init()和destroy()两个方法.除非需要在初始化Servlet时,完成某些资源初始化的方法,才考虑重写init方法.
如果需要在销毁Servlet之前,先完成某些资源的回收,比如关闭数据库连接等,才需要重写destroy方法.

Servlet和jsp的区别在于:
Sevlet中没有内置对象,原来jsp中的内置对象都必须由程序显示创建.
对于静态的HTML标签,Servlet都必须使用页面输出流逐行输出.


Servlet的配置
编辑好的Servlet源文件并不能响应用户请求,还必须将其编译成class文件.将编译后的.class文件放在WEB-IF/class路径下,如果Servlet有包,则还应该将class文件放在对应的包路径下.
为了让Servlet能够响应用户请求,还必须将Servlet配置在web应用中.配置Servlet时,需要修改web.xml文件.

配置Servlet有两种方式:
1.在Servlet类中使用@WebServlet Annotation进行配置(标注设置)
例如在HelloServlet.java中:@WebServlet("/hello.view")
只要在Servlet上设置@webServlet标注,容器就会自动读取当中的信息.上面的@webServlet告诉容器,如果请求的URL是"/hello.view",则由HelloServlet的实例提供服务.可以使用@webServlet提供更多信息
@WebServlet(
name="",//默认值是Servlet的类完整名称
urlPatterns="",//URL名称
loadOnStartup=1//默认值-1,设置大于0,表示启动应用程序后就要初始化Servlet
)
如果希望应用程序启动时,先将Servlet类载入,实例化并做好初始化动作,则可以用loadStartup
2.通过在web.xml文件进行配置
如下面这个文件(展开WebContent/WEb-INF节点,在web-inf节点上点击创建web.xml文件,名称必须为web,也可以在创建工程的时候勾选创建.)
web.xml
这样的文件称为部署描述文件(简称DD文件).使用web.xml定义是比较麻烦些.不过web.xml中的设置会覆盖Servlet中的标注设置,可以使用标注来作默认值,而web.xml来作日后更改设置值之用.
在web.xml中多个Servlet设置<load-on-startup>时使用了相同的顺序,则依其在web.xml中设置的顺序来初始Servlet,
在使用标注的情况下,如果有多个Servlet在设置loadStartup时使用了相同的数字,则容器实现厂商可以自行决定要如何载入哪个SErvlet.
从web.xml中可以看出一个Servlet在web.xml中会有三个名称设置:
<url-pattern></url-pattern>:设置逻辑名称,web容器会根据这个名称对应至实际处理请求的文件或程序实体名称.
<servlet-name> </servlet-name>:注册的Servlet名称
<servlet-class> </servlet-class>:实体类名称

在Servlet3.0之前,只能使用web.xml设置,代码重用时还需要配置web.xml,不太方便.在Servlet3.0之后,才有了@WebServlet标注这个功能,


Service.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action="First" method="post" >
用户名:
<input type="text" name="name" ><br>
密码:
<input type="password" name="pass" ><br>
 <input type="submit" value="提交">

</form>
</body>
</html>

First.java
package 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;

/**
 * Servlet implementation class First
 */
@WebServlet("/First")
public class First extends HttpServlet {
	private static final long serialVersionUID = 1L;

	/**
	 * @see HttpServlet#HttpServlet()
	 */
	public First() {
		super();
		// TODO Auto-generated constructor stub
	}

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse
	 *      response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse
	 *      response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		PrintWriter out = response.getWriter();
		out.println("<html>");
		out.println("<head> ");
		out.println("</head> ");
		out.println("<body>");
		out.println("<h1>JSP<h1>");
		out.println("<body>");
		out.println("</html> ");
	}

}



web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
  <display-name>2018-3-18</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
  <servlet>
    <servlet-name>First</servlet-name>
  <servlet-class>Servlet.First</servlet-class>
  </servlet>
  <servlet-mapping>
  
  <servlet-name>First</servlet-name>
  <url-pattern>/First</url-pattern>
  </servlet-mapping>
</web-app>


运行后如下图:
提交后:

虽然上述例子都设置两种标注,但是web.xml中的设置会覆盖Servlet中的标注设置.



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值