浅谈Servlet

目录

一、简介:

1.软件结构发展史:

2.B/S模式执行流程:

3.请求和响应:

4.J2EE:

 5.Apache Tomcat:

6.J2EE与Tomcat的关系:

7.Servlet:

 二、Servlet:

1.标准Java Web工程结构:

2.Servlet开发步骤:

3.Servlet访问方法: 

4.请求参数:

5.Servlet接收请求参数:

6.Get和Post方法:

7.Servlet生命周期:

8.使用注解简化配置:

9.启动时加载Servlet:


一、简介:

1.软件结构发展史:

①单机时代——桌面应用

  • 桌面应用俗称单机应用,软件所有数据都保存在电脑本地硬盘中。
  • 优点:易于使用,结构简单。
  • 缺点:数据难以共享、安全性差、更新不及时。
  • 如word、eclipse等

②联机时代(Client-Server模式)

  • Client/Server结构(C/S结构)指客户端和服务器结构
  • 优点数据共享方便,安全性高。
  • 缺点:必须安装客户端,升级与维护困难。
  • 如QQ、微信、支付宝等。  

③互联网时代(Browser-Server模式)

  • Browser-Server(B/S)模式指浏览器和服务器架构模式。
  • 优点:开发简单,无需安装客户端,数据易于共享。
  • 缺点:相较于C/S模式,执行速度与用户体验相对较弱。
  • 如百度、淘宝、各种网站等。

2.B/S模式执行流程:

通过浏览器把数据发送给服务器 ,服务器生成对应的Html代码并返回给浏览器,浏览器对其解释后显示给用户。

3.请求和响应:

  • 从浏览器发送给服务器的数据包称为“请求(Request)”。
  • 从服务器返回给浏览器的结果称为“响应(Response)”。

4.J2EE:

  • J2EE(Java 2 Platform Enterprise Edition)指 "Java 2 企业版"。它由SUN公司领导,是市场上主流的企业级分布式应用平台的解决方案
  • 开发BS(Web)应用程序就是J2EE最核心的功能。
  • J2EE由13个应用模块组成。

 5.Apache Tomcat:

  • Tomcat是Apache软件基金会旗下一款免费的开源的Web应用服务器程序

6.J2EE与Tomcat的关系:

  • J2EE是一组技术规范和指南,具体实现由软件厂商决定。
  • Tomcat是J2EE Web(Servlet和JSP 2个模块)标准的实现者
  • J2SE是J2EE运行的基石,运行Tomcat离不开J2SE(JRE和JDK)。

7.Servlet:

  • Servlet(Server Applet)是服务器小程序,只要用于生成动态Web内容
  • Servlet是J2EE最重要的组成部分。

 二、Servlet:

例:第一个Servlet

FirstServlet.java:

package com.servlet;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class FirstServlet extends HttpServlet {

	// 重写父类的该方法(参数1:请求,参数2:响应)
	@Override
	protected void service(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		// 接收请求发来的参数
		String name = request.getParameter("name");
		String html = "<h1 style='color:red'>hi," + name + "!<hr></br>";
		System.out.println("返回给浏览器的响应数据是:" + html);
		PrintWriter out = response.getWriter();
		out.println(html); // 将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>FirstServlet</display-name>
	<!-- 声明Servlet -->
	<servlet>
		<!-- servlet的别名 -->
		<servlet-name>first</servlet-name>  <!-- 自定义即可。设置原因:1.使用别名更简洁。2.servl的完整路径是敏感信息,不该轻易暴露。所有赋予别名,通过别名绑定URL -->
		<servlet-class>com.servlet.FirstServlet</servlet-class>
	</servlet>

	<!-- 将Servlet和URL绑定 ,注意name要相同 -->
	<servlet-mapping>
		<servlet-name>first</servlet-name>
		<url-pattern>/hi</url-pattern> <!-- 访问时不是直接访问servlet,而是通过设置的<url-pattern>的内容访问 -->
	</servlet-mapping>
</web-app>

 图解执行流程:

1.标准Java Web工程结构:
 

标准Java Web工程结构
组织结构描述
tomcat安装目录/webapps/Tomcat 应用根目录,存放所有Web应用
/web应用目录/Java Web 应用目录
/web应用目录/index.html(或.jsp)默认首页
/WEB-INFWEB应用的安全目录,用于存放配置文件
/WEB-INF/web.xmlweb.xml是"部署描述符文件",是该Web项目核心配置文件
/WEB-INF/classes存放编译后的class文件
/WEB-INF/lib存放web应用依赖的jar文件
/META-INF/MANIFEST.MF包含Web应用的版本信息

2.Servlet开发步骤:

创建Servlet类继承HttpServlet类(Servlet与标准Java类的区别)。

重写service方法,编写程序代码。

③配置web.xml,绑定URL。

3.Servlet访问方法: 

  • http://IP端口地址/context-path/url-mapping
  • 远程访问IP地址,本地访问localhost(默认端口是8080)。
  • context-path成为”上下文路径“,默认为工程名
  • url-mapping映射地址

例:

package com.servlet;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class SimpleServlet extends HttpServlet {
	@Override
	protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
	PrintWriter out=response.getWriter();  //getWriter()是向浏览器输出到数据流
	out.println("<a href='http://www.baidu.com'>baidu</a>");  //向浏览器输出希望显示的内容

	}
}

 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>FirstServlet</display-name>
	<!-- 声明Servlet -->
	<servlet>
		<!-- servlet的别名 -->
		<servlet-name>simple</servlet-name> 
		<servlet-class>com.servlet.SimpleServlet</servlet-class>
	</servlet>

	<servlet-mapping>
		<servlet-name>simple</servlet-name>
		<url-pattern>/simple</url-pattern> 
	</servlet-mapping>
</web-app>

4.请求参数:

  • 请求参数是指浏览器通过请求向Tomcat提交的数据。
  • 请求参数通常是用户输入的数据,使Servlet进行处理。
  • 格式:参数1=值a&参数2=值b&参数3=值c......
  • 请求参数通过URL向服务器发送。

表单如和与servlet连接? 通过<form>标签的action属性

5.Servlet接收请求参数:

  • 接收单个参数:request.getParameter()
  • 接收多个同名参数(如复选框):request.getParameterValues()

例:

Student.html:

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<h1>学员信息登记表</h1>
	<form action="/FirstServlet/simple">  <!--  http://localhost:8080 是默认指向,不用写 -->
		姓名:<input name="name"><br /> 电话:<input name="mobile"><br />
		性别: <select name="sex" style="width: 100px; padding: 5px;">
			<option value="male">男</option>
			<option value="female">女</option>
		</select><br /> 
		特长: 
		<input type="checkbox" name="spec" value="English" />英语 
		<input type="checkbox" name="spec" value="Program" />编程
		<input type="checkbox" name="spec" value="Speech" />演讲 
		<input type="checkbox" name="spec" value="Swim" />游泳<br /> 
		<input type="submit" value="提交"><br />
	</form>
</body>
</html>
package com.servlet;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class SimpleServlet extends HttpServlet {
	@Override
	protected void service(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		String name = request.getParameter("name");
		String mobile = request.getParameter("mobile");
		String sex = request.getParameter("sex");
		String[] spec = request.getParameterValues("spec");
		PrintWriter out = response.getWriter(); // getWriter()是向浏览器输出到数据流
		out.println("<h1>name:" + name + "</h1>");
		out.println("<h1>moblie:" + mobile + "</h1>");
		out.println("<h1>sex:" + sex + "</h1>");
		for (String n : spec) {
			out.println("<h2>spec:" + n + "</h2>");
		}
	}
}

6.Get和Post方法:

Get方法是将数据通过在URL附加数据显性向服务器发送数据。

  • http://localhost:8080/FirstServlet/sample?name=Isebal
  • 表单默认采用get方法

Post方法是将数据存放在 "请求体" 中隐性向服务器发送数据,并不在URL中体现,我们也看不见。

  • http://localhost:8080/FirstServlet/sample
  • 请求体:name=Isebal
  • 更安全。

③修改表单提交方式:在<form>标签中添加 method=""

 地址栏不显示数据了。

 注意service()请求处理的核心方法,无论是get或post都会被service()方法处理。

 ④可通过getMethod()方法获取当前的提交方法

package com.servlet;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class SimpleServlet extends HttpServlet {
	@Override
	protected void service(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		String method=request.getMethod();
		PrintWriter out = response.getWriter(); // getWriter()是向浏览器输出到数据流
		out.println("<h1>method:" + method + "</h1>");
	}
}

⑤Servlet针对Get和Post方法提供了对应的方法处理:doGet()doPost()

方法参数格式如下:

package com.servlet;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class RequestMethodServlet extends HttpServlet {
	@Override
	// 处理get请求
	protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		String name = request.getParameter("name");
		response.getWriter().println("<h1 style='color:green'>" + name + "</h1>");
	}

	@Override
	// 处理post请求
	protected void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		String name = request.getParameter("name");
		response.getWriter().println("<h1 style='color:red'>" + name + "</h1>");
	}
}
<?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>FirstServlet</display-name>
	<!-- 声明Servlet -->
        <servlet>
		<!-- servlet的别名 -->
		<servlet-name>request_method</servlet-name> 
		<servlet-class>com.servlet.RequestMethodServlet</servlet-class>
	</servlet>

	<servlet-mapping>
		<servlet-name>request_method</servlet-name>
		<url-pattern>/request_method</url-pattern> 
	</servlet-mapping>
</web-app>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<h1>学员信息登记表</h1>
	<form action="/FirstServlet/request_method" method="get">  
		姓名:<input name="name"/><br /> 
		<input type="submit" value="提交"><br />
	</form>
</body>
</html>

 

⑥ 总结:

  • service()方法:对所有请求进行无差别处理(实际是区分不同请求转给doGet()方法或doPost()方法)。
  • doGet()方法:处理Get请求。
  • doPost()方法:处理Post请求。
  • Get方式常用于不包含敏感信息的查询功能。
  • Post方式用于安全性要求较高的功能或服务器的 " 写 " 操作(如用户登录、用户注册、更新公司账目等)。

7.Servlet生命周期:

①装载:Tomcat解析web.xml,确定servlet存在。

②创建:第一次访问servlet时,创建servlet对象,执行其构造函数。

初始化:init()
提供服务:service()、doGet()、doPost()
销毁:当服务重启或关闭时执行destory()

例:

  • package com.servlet;
    
    import java.io.IOException;
    import java.io.PrintWriter;
    
    import javax.servlet.ServletConfig;
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    public class FirstServlet extends HttpServlet {
    
    	public FirstServlet() {
    		System.out.println("正在创建FirstServlet对象!");
    	}
    	
    	@Override
    	public void init(ServletConfig config) throws ServletException {
    		System.out.println("正在初始化FirstServlet对象!");
    	}
    	
    	@Override
    	protected void service(HttpServletRequest request, HttpServletResponse response)
    			throws ServletException, IOException {
    		// 接收请求发来的参数
    		String name = request.getParameter("name");
    		String html = "<h1 style='color:red'>hi," + name + "!<hr></br>";
    		System.out.println("返回给浏览器的响应数据是:" + html);
    		PrintWriter out = response.getWriter();
    		out.println(html); // 将html发送回浏览器
    	}
    
    	@Override
    	public void destroy() {
    		System.out.println("正在销毁FirstServlet对象!");
    	}
    }
    

启动服务器后,会发现控制器没有任何输出,因为只有在首次访问时才会初始化。在页面访问后,控制台完成了②③④步。修改代码保存,应用重启,执行destory()方法。再次访问页面,又重新初始化servlet对象......注意Tomcat全局中只有一个servlet对象。

8.使用注解简化配置:

  • Servlet 3.x之后引入了 " 注解Annotation " 特性。
  • 注解用于简化Web应用程序的配置过程。
  • Servlet核心注解:@WebServlet

 例:

package com.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("/anno") // 括号内是映射路径 ,告诉Tomcat当前类是一个servlet
public class AnnotationServlet extends HttpServlet {
	@Override
	protected void service(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		response.getWriter().println("I'm AnnotationServlet!");
	}
}

 不需要再web.xml中配置。

9.启动时加载Servlet:

  • 在web.xml中使用<load-on-startup>设置启动时加载
  • <load-on-startup>0~9099</load-on-startup>  0表示优先级最高,最先被执行
  • 启动时加载在工作中常用于系统的预处理。

 例:

package com.servlet;

import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;

public class CreateServlet extends HttpServlet{
	@Override
	public void init(ServletConfig config) throws ServletException {
		System.out.println("正在创建数据库!");
	}

}
package com.servlet;

import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;

public class ImportServlet extends HttpServlet {
	@Override
	public void init(ServletConfig config) throws ServletException {
		System.out.println("正在导入数据!");
	}
}
package com.servlet;

import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;

public class AnalyseServlet extends HttpServlet {
	@Override
	public void init(ServletConfig config) throws ServletException {
		System.out.println("正在分析数据!");
	}
}
<?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">
	<!-- 声明Servlet -->
	<servlet>
		<!-- servlet的别名 -->
		<servlet-name>create</servlet-name>  <!-- 自定义即可。设置原因:1.使用别名更简洁。2.servl的完整路径是敏感信息,不该轻易暴露。所有赋予别名,通过别名绑定URL -->
		<servlet-class>com.servlet.CreateServlet</servlet-class>
		<load-on-startup>0</load-on-startup>
	</servlet>
	<servlet>
		<servlet-name>import</servlet-name>
		<servlet-class>com.servlet.ImportServlet</servlet-class>
		<load-on-startup>1</load-on-startup>
	</servlet>
	<servlet>
		<servlet-name>analyse</servlet-name>
		<servlet-class>com.servlet.AnalyseServlet</servlet-class>
		<load-on-startup>2</load-on-startup>
	</servlet>
</web-app>

 或者用注解:

注意使用注解开发时,强制要求要设置一个URL,即使用不到这个URL。

package com.servlet;

import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;

@WebServlet(urlPatterns="/ss",loadOnStartup=2)
public class AnalyseServlet extends HttpServlet {
	@Override
	public void init(ServletConfig config) throws ServletException {
		System.out.println("正在分析数据!");
	}
}

删除web.xml中对AnalyseServlet的配置,运行结果同上。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值