从零开始的Java开发2-10-2 Servlet入门:Servlet开发步骤请求参数的发送与接收Get和Post注解

Posted karshey

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了从零开始的Java开发2-10-2 Servlet入门:Servlet开发步骤请求参数的发送与接收Get和Post注解相关的知识,希望对你有一定的参考价值。

文章目录

概述

软件结构发展史

  1. 单机时代:桌面应用
  2. 联机时代:Client-Server模式
  3. 互联网时代:Broswer-Server模式

单机时代:桌面应用

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

联机时代:Client-Server模式

  • Client/Server结构(C/S结构)是指客户端和服务器结构
  • 优点:数据方便共享,安全性高
  • 缺点:必须安装客户端,升级与维护困难

典型应用:QQ,微信,支付宝。

互联网时代:Browser-Server模式

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

典型应用:百度,淘宝,京东

Tomcat与Servlet

B/S模式执行流程

用户写上网址baidu.com后,浏览器根据DNS服务器得知该网址对应的ip地址,然后通过http协议将其发送到远程的服务器主机,服务器主机的服务器程序动态地生成了html文档。


html文档会返回给浏览器。浏览器对html进行解析,用户就能看到他想看到的了。

请求与相应

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

请求和响应必须成对出现。

J2EE

  • J2EE(Java 2 Platform Enterprise Edition),Java2企业版
  • 开发BS(Web)应用程序就是J2EE最核心的功能
  • J2EE由13个功能模块组成

13个模块如下:

要重点学习的:

  • Servlet
  • JSP
  • JDBC

Apache Tomcat

一个Web应用服务器程序。

J2EE与Tomcat的关系

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

Servlet

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

我们可以把Tomcat看成服务器主机,Servlet看成服务器程序。

Servlet

第一个Servlet

这是我们的第一个Servlet:

//一定要继承HttpServlet
public class FirstServlet extends HttpServlet

	@Override
	protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
		//接收请求发来的参数
		String name=request.getParameter("name");
		String html="<h1 style='color:red'>hi,"+name+"!</h1>";
		System.out.println("返回给浏览器的html为:");
		PrintWriter out=response.getWriter();
		//将html发送回浏览器
		out.println(html);
	

要在工程的WEB-INF中配置web.xml:

这是我们添加的xml。

<!-- 配置Servlet -->
  <!-- 声明Servlet -->
  <servlet>
	  <!-- Servlet的别名:两个name要一致 -->
	  <servlet-name>first</servlet-name>
	  <servlet-class>com.servlet.FirstServlet</servlet-class>
  </servlet>
  
  <!-- 将Servlet与URL绑定 -->
  <servlet-mapping>
  	<servlet-name>first</servlet-name>
  	<url-pattern>/hi</url-pattern>
  </servlet-mapping>

然后点击debug,然后:

在浏览器中输入:localhost:8080——这是Tomcat;
输入:localhost:8080/FirstServlet/hi,这是我们刚刚写的:

可以打一个?表示参数:

图解执行流程

输入的是/hi,url-pattern为/hi对应的servlet-name为first,servlet-name为first对应的servlet-class为com.imooc.servlet.FirstServlet,这就是我们写java代码的地方。

JavaWeb工程结构


举个例子

我们刚刚发布了一个FirstServlet。

我们在Tomcat的文件夹中能发现:

点开FirstServlet会看到META-INF和WEB-INF。


WEB-INF下会有classes、lib、和web.xml:

web.xml就是我们刚刚配置xml的文件。

把classes一直往下点,会看到FirstServlet.class,就是我们刚刚写java的地方。


lib保存的是第三方的jar包,不过现在还没有。

Eclipse会和Tomcat整合在一起。

默认首页
在webapp下创建一个index.html:


这就是我们FirstServlet的默认首页:在浏览器中输入:localhost:8080/FirstServlet/

Servlet开发步骤

  • 创建Servlet类,继承HttpServlet
  • 重写service方法,编写程序代码
  • 配置web.xml,绑定URL

举个例子

前两步:

//创建Servlet类,继承HttpServlet
public class SampleServlet extends HttpServlet 
	// 重写service方法,编写程序代码
	public void service(HttpServletRequest request, HttpServletResponse response) throws IOException 
		// 向浏览器输出的数据流
		PrintWriter out = response.getWriter();// 这里有一个异常,我们这里抛出
		out.println("<a href='https://blog.csdn.net/karshey'>My Blog</a>");

	

第三步:

<servlet>
	<servlet-name>sample</servlet-name>
	<servlet-class>com.servlet.SampleServlet</servlet-class>
</servlet>

<servlet-mapping>
	<servlet-name>sample</servlet-name>
	<url-pattern>/sample</url-pattern>
</servlet-mapping>

Servlet访问方法

  • 远程访问使用IP地址:http://IP地址:端口/context-path/url-mapping
  • 本地访问用localhost(127.0.0.1)
  • context-path称为"上下文路径",默认为工程名

按照上面提过的方法把工程添加到Server中,点击debug,然后在浏览器中输入http://localhost:8080/FirstServlet/sample


点进去后就是我的博客了。

请求参数的发送与接收

  • 请求参数是指浏览器通过请求向Tomcat提交的数据
  • 请求参数通常是用户输入的数据,待Servlet进行处理
  • 格式:参数名1=值1&参数名2=值2&...,可以用&连接多个参数

举个例子

我们在webapp下新增一个html文件:

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>学生信息登记表</title>
</head>
<body>
	<h1>学生信息登记表</h1>
	<!-- action表示表单提交以后发送的地址是 -->
	<form action="http://localhost:8080/FirstServlet/sample">
		姓名:<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>
		
		特长:
		<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="Swimming"/>游泳
		<br/> 
		
		<input type="submit" value="提交">
		<br/>
	</form>
</body>
</html>

我们这样填写:

点击提交后,页面跳转到:“http://localhost:8080/FirstServlet/sample”

我们可以看到它的参数是:name=Tom&mobile=12345678&sex=male&spec=English&spec=Program

就是我们填的参数,且键与值用=连接,键值对之间用&连接。
这就是请求参数

实际上:

<form action="http://localhost:8080/FirstServlet/sample">

可以简化成如下,因为http://localhost:8080是默认地址。

<form action="/FirstServlet/sample">

Servlet接收请求参数

  • request.getParameter() - 接受单个参数(一般用这个)
  • request.getParameterValues() - 接收多个同名参数(复选框可以用这个)
public class SampleServlet extends HttpServlet 
	// 重写service方法,编写程序代码
	public void service(HttpServletRequest request, HttpServletResponse response) throws IOException 
		//获取单个请求参数
		String name=request.getParameter("name");
		// 向浏览器输出的数据流
		PrintWriter out = response.getWriter();// 这里有一个异常,我们这里抛出
		out.println("<h1>name:"+name+"</h1>");
	

我们在表单中填入姓名Tom。

则:

举一反三,把其他信息全部输出:

//创建servlet类,继承HttpServlet
public class SampleServlet extends HttpServlet 
	// 重写service方法,编写程序代码
	public void service(HttpServletRequest request, HttpServletResponse response) throws IOException 
		// 获取单个请求参数
		String name = request.getParameter("name");
		String mobile = request.getParameter("mobile");
		String sex = request.getParameter("sex");
		String[] specs = request.getParameterValues("spec");
		// 向浏览器输出的数据流
		PrintWriter out = response.getWriter();// 这里有一个异常,我们这里抛出
		out.println("<h1>name:" + name + "</h1>");
		out.println("<h1>mobile:" + mobile + "</h1>");
		out.println("<h1>sex:" + sex + "</h1>");
		out.println("specs:");
		for (int i = 0; i < specs.length; i++) 
			out.print(specs[i] + " ");
		

	


把所有都填上:

则:

且网址如下:
http://localhost:8080/FirstServlet/sample?name=Tom&mobile=123456789&sex=male&spec=English&spec=Program&spec=Speech&spec=Swimming

也可以通过地址栏传递参数:

Get和Post请求方法

Get方式是将数据通过在URL附加数据显性向服务器发送数据。
如:http://localhost:8080/FirstServlet/sample ?name=Tom

Post方式会将数据存放在"请求体"中隐性向服务器发送数据。
如:
http://localhost:8080/FirstServlet/sample
请求体:name=Tom

表单提交默认是get方法,我们可以用post方法:

<form action="/FirstServlet/sample" method="post">



URL后没有参数了。

在浏览器F12:点击NetWork,点击sample,点击Response,可以看到:

Get和Post传递的数据格式完全相同(都是键=值&键=值),只是存放的地址不同。

与service方法的关系

  • service()是请求处理的核心方法,无论是get还是post都会被service()方法处理
  • 可以用request.getMethod()方法得知是用get方法还是post方法

用于专门处理get和post——get和post是可以分别进行处理的

  • 专门处理get的:doGet()
  • 专门处理post的:doPost()

代码:我们让get方法写绿色,post方法写红色。

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

配置xml:一般url中都小写,单词间用_连接

<!-- 配置doGet和doPost -->
<servlet>
	<servlet-name>requestMethod</servlet-name>
	<servlet-class>com.servlet.RequestMethodServlet</servlet-class>
</servlet>

<servlet-mapping>
	<servlet-name>requestMethod</servlet-name>
	<url-pattern>/request_method</url-pattern>
</servlet-mapping>

get时:

<form action="/FirstServlet/request_method" method="get">

看url,很明显这是get:

post时:

Get和Post处理方式小总结

  • 所有请求:service()
  • Get请求-doGet()
  • Post请求-doPost()

如果没有将service重写,那么它就相当于get和post的分发器:若这是一个get,它就把它交给doGet处理,反之亦然。

应用场景:

  • Get常用于不包含敏感信息的查询功能
  • Post用于安全性要求较高的功能或服务器的“写”操作,如:用户登录、用户注册、更新公司账目

Servlet生命周期

  • 装载-web.xml
  • 创建-构造函数
  • 初始化-init()
  • 提供服务-service()
  • 销毁-destroy()

用代码演示一下:

public class FirstServlet extends HttpServlet 

	public FirstServlet() 
		System.out.println("正在  创建  Servlet对象");
	

	@Override
	public void init(ServletConfig config) throws ServletException 
		System.out.println("正在  初始化  Servlet对象");
	

	@Override
	protected void service(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException 
		// 接收请求发来的参数
		String name = request.getParameter("name");
		String html = "<h1 style='color:red'>hi," + name + "!</h1>";
		System.out.println("返回给浏览器的html为:");
		PrintWriter out = response.getWriter();
		// 将html发送回浏览器
		out.println(html);
	

	@Override
	public void destroy() 
		System.out.println("正在  销毁  Servlet对象");
	



启动Servlet,访问网址:http://localhost:8080/FirstServlet/hi

则控制台:

正在  创建  Servlet对象
正在  初始化  Servlet对象
返回给浏览器的html为:

随便修改一下代码内容再保存,则就销毁:

PS:我刷新了几次页面,所以返回给浏览器的html为:不止一个。

因为我们保存以后Tomcat会自动销毁对象,然后重新加载一个新的对象。此时如果再刷新,就会再创建一个新的对象。

对于每一个Servlet来说,在运行时有且只有一个Servlet对象在服务。

使用注解简化配置

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

举个例子

//注解,参数是绑定的url-pattern
@WebServlet("/anno")
public class AnnotationServlet extends HttpServlet 

	@Override
	protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException 
		resp.getWriter().print("I am annotation servlet!");
	


则:

启动时加载Servlet

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

举个例子
假设现在我们开发一个系统,在系统启动的时候要自动完成初始化数据库、导入数据、统计分析这三个工作。
我们希望CreateServlet负责创建数据库,在程序启动的时候自动完成这个工作。

java:

public class CreateServlet extends HttpServlet
	
	//要重写init
	@Override
	public void init() throws ServletException
		System.out.println("正在创建数据库");
	

web.xml配置:

<!-- 配置 -->
<servlet>
	<servlet-name>create</servlet-name>
	<servlet-class>com.servlet.CreateServlet</servlet-class>
	<!-- 启动时加载 若数字为0说明它会在启动时最先被加载-->
	<load-on-startup>0</load-on-startup>
</servlet>

控制台:

我们再创建一个ImportServlet,用来自动导入数据。代码与上面相似,只是xml的<load-on-startup>1</load-on-startup>是1.

控制台:

再创建一个分析结果的:用注解的时候一定要绑定一个url。

@WebServlet(urlPatterns="/unused",loadOnStartup=2)
public class AnalysisServlet extends HttpServlet
	
	//要重写init
	@Override
	public void init() throws ServletException
		System.out.println("正在分析结果");
	

运行后控制台:

以上是关于从零开始的Java开发2-10-2 Servlet入门:Servlet开发步骤请求参数的发送与接收Get和Post注解的主要内容,如果未能解决你的问题,请参考以下文章

从零开始的Java开发2-10-3 JSP入门:JSP介绍语法和页面重用

温故知新从零开始搭建 java web项目

从零开始手写Tomcat的教程5节---servlet容器

零基础学java应该从哪里开始?

从零开始002构建简易servlet完成发布与访问

Java开发从零开始!java游戏服务器开发教程