从零开始的Java开发2-10-2 Servlet入门:Servlet开发步骤请求参数的发送与接收Get和Post注解
Posted karshey
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了从零开始的Java开发2-10-2 Servlet入门:Servlet开发步骤请求参数的发送与接收Get和Post注解相关的知识,希望对你有一定的参考价值。
文章目录
概述
软件结构发展史
- 单机时代:桌面应用
- 联机时代:Client-Server模式
- 互联网时代: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注解的主要内容,如果未能解决你的问题,请参考以下文章