title: "Servlet"
date: 2019-08-17T11:01:12+08:00
本章内容为:《Servlet基础》
作者:nuoccc
这篇文章 主要是了解Servlet的一些基础。
Servlet(Server Applet)是Java] Servlet的简称,称为小服务程序或服务连接器,用Java编写的服务器端程序,
具有独立于平台和协议的特性,主要功能在于交互式地浏览和生成数据,生成动态Web内容。
而Servlet/JSP是SUN公司定义的一套动态网页开发的技术。
所以我们首先来了解一下什么是JSP。
1.JSP
1.1 JSP简介
JSP全名为Java Server Pages,中文名叫java服务器页面,其根本是一个简化的Servlet设计,它是由Sun公司倡导、许多公司参与一起建立的一种动态网页技术标准。JSP技术有点类似ASP技术,它是在传统的网页HTML文件(.htm,.html)中插入Java程序段(Scriptlet)和JSP标记(tag),从而形成JSP文件,后缀名为(*.jsp)。 用JSP开发的Web应用是跨平台的,既能在Linux下运行,也能在其他操作系统上运行。
它实现了Html语法中的java扩展(以 <%, %>形式)。JSP与Servlet一样,是在服务器端执行的。通常返回给客户端的就是一个HTML文本,因此客户端只要有浏览器就能浏览。
JSP技术使用Java编程语言编写类XML的tags和scriptlets,来封装产生动态网页的处理逻辑。网页还能通过tags和scriptlets访问存在于服务端的资源的应用逻辑。JSP将网页逻辑与网页设计的显示分离,支持可重用的基于组件的设计,使基于Web的应用程序的开发变得迅速和容易。 JSP(JavaServer Pages)是一种动态页面技术,它的主要目的是将表示逻辑从Servlet中分离出来。
Java Servlet是JSP的技术基础,而且大型的Web应用程序的开发需要Java Servlet和JSP配合才能完成。JSP具备了Java技术的简单易用,完全的面向对象,具有平台无关性且安全可靠,主要面向因特网的所有特点。
1.2 JSP基础运用
这里主要其实还是把JSP当做一个网页来使用,所以就不深入,就基础运用就行。
我使用的是IDEA,所以可能跟Eclipse的创建JSP方式不同,这里讲IDEA创建JSP方式。
1.File->New->Project
2.Java->Web application->Next
3.ProjectName->Finish
4.Projetc->web->New->JSP/JSPX
这样一个JSP文件就创建完成,然后我们来运用一下,JSP就其实跟HTML文件很类似,然后能以( <%, %>形式)
实现JAVA代码,我们就编写一个最基础的JAVA的九九乘法表,看下运行效果
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%
//运行JAVA的标签
for(int i=1;i<=9;i++){
for(int j=1;j<=i;j++){
out.print(i+"*"+j+"="+i*j+"  ");
//要打印在网页上,就不再是Syetem.out.print而是out.print
}
out.print("<br>");
}
%>
</body>
</html>
然后要注意一点,如果编译器代码报错,显示红色,只要确认你代码没问题就别管,有时候编译器会识别错误
然后我们加入Tomcat,在左上角,如下图,然后点击Add Config...
进入到下面这个页面,点左上的+,然后找到Tomcat Server 然后点击 Local
然后进到下面这个页面先不管Server的内容,点击Deployment,然后点击左边的“+”,然后点击第一个,加入完成后点击OK就配置好了
然后点击右上面的那个三角形启动图标,就会自动弹出一个页面,然后在网址后面跟上你的文件名,就能看到你的页面了。
然后jsp的运用我们就先讲到这里,这不是这篇文章的关键,然后我们来了解下Servlet。
2.Servlet
2.1创建一个Servelt
我们前面知道一般的web项目都是通过Servelt加JSP来实现的,所以我们创建的项目一定就要既能创建JAVA文件又能创建JSP文件,在IDEA中可以快速创建这样的文件。
1.File->New->Project
2.Java Enterprise->Web Application->Next
这种创建方式会直接导入Tomcat
然后我们创建第一个Servlet
public class HelloServlet implements Servlet {
//HelloServlet是我们创建的类必须要继承或者实现Servlet接口之后,我们的类才是一个真正意义上的"Servelt"。
@Override
public void init(ServletConfig servletConfig) throws ServletException {
}
@Override
public ServletConfig getServletConfig() {
return null;
}
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
}
@Override
public String getServletInfo() {
return null;
}
@Override
public void destroy() {
}
}
Servlet接口自带五个方法,我们来仔细看下这五个方法的意义
void init(ServletConfig var1) throws ServletException;
我们先来看第一个方法,init是initialization的缩写,这个是一个初始化函数,初始化一个Servlet配置对象
我们在来看下ServletConfig这个类定义了什么
public interface ServletConfig {
String getServletName();
//定义了一个获得我们Servlet名字的方法
ServletContext getServletContext();
//获得我们Servlet环境的方法
String getInitParameter(String var1);
//获得初始化参数
Enumeration<String> getInitParameterNames();
//获得初始化参数的集合
}
所以ServletConfig这个类的对象获得了就是一些配置信息,然后调用init方法来初始化,此方法是系统自动调用!
public ServletConfig getServletConfig() ;
第二个方法,获得一个ServletConfig对象,就是获取Servlet的配置信息,也是系统自动调用!
void service(ServletRequest var1, ServletResponse var2) throws ServletException, IOException;
第三个方法,定义了一个服务方法,传递了两个参数
第一个是一个ServletRequest对象,然后我们去原码看看这个服务请求对象定义了什么,
我们看到全是一些set,get方法用来设置或者获取某个值,但是太多了就不一一讲,我们就看几个经常用到的函数。
void setCharacterEncoding(String var1) throws UnsupportedEncodingException;
这个是我们经常使用的一个方法,传入一个字符集参数,设置字符集,主要是防止数据传递时乱码。
String getParameter(String var1);
这个方法用来获得一个参数,这个方法还有几个兄弟方法
Enumeration<String> getParameterNames();
String[] getParameterValues(String var1);
Map<String, String[]> getParameterMap();
都是获得参数的方法,只不过返回值不一样
Object getAttribute(String var1);
void setAttribute(String var1, Object var2);
这两个方法是成对存在的一半,第一个是获得一个对象的属性,第二个是设置一个对象的属性
ServletRequest对象常用的方法,就这些,接下来我们来看看ServletResponse对象的方法
同样的ServletResponse服务器响应类也是一些set和get方法,我们也了解最常用的方法:
void setContentType(String var1);
这个方法是跟请求的时候设置字符集类似的,这个是设置内容格式的一个方法,也是我们常用的方法。
PrintWriter getWriter() throws IOException
这个方法是获得文件打印流的方法,PrintWriter继承Writer,所以拥有write()方法,可以输出内容。
ServletResponse常用的就这两个方法,然后我们继续看Servlet接口的方法。
String getServletInfo();
第四个方法,获得SevletInfo就是获得Sevlet的信息,也是系统自动调用!
void destroy();
第五个方法,销毁Servlet对象,也是系统调用!
所以Servlet接口定义的五个接口,有四个都是系统自动调用的,只有service()方法是需要我们自己调用的,所以service()就是我们在Servlet中最重要的一个方法。
我们知道JSP其实是简化的Servlet,所以学完上述方法后,我们也能用Servlet写一个页面
public class HelloServlet implements Servlet {
@Override
public void init(ServletConfig servletConfig) throws ServletException {
}
@Override
public ServletConfig getServletConfig() {
return null;
}
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
servletResponse.setContentType("text/html;charset=utf-8");
//设置内容格式为html,字符集为utf-8
servletResponse.getWriter().write("<html>");
servletResponse.getWriter().write("<head>");
servletResponse.getWriter().write("<meta charset=\"UTF-8\">");
servletResponse.getWriter().write("<title>this is title</title>");
servletResponse.getWriter().write("</head>");
servletResponse.getWriter().write("<body>");
servletResponse.getWriter().write("<h1>第一个Servlet</h1>");
servletResponse.getWriter().write("</body>");
servletResponse.getWriter().write("</html>");
//输出内容,这里我们直接输出一个html页面
}
@Override
public String getServletInfo() {
return null;
}
@Override
public void destroy() {
}
}
但是只有代码还是无法输出在浏览器上,因为根本不知道你是哪一个页面,所以我们还需要去配置xml告诉浏览器我这个代码服务在哪个页面上,找到web->WEB-INF下面的web.xml我们对这个文件进行配置
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<servlet>
<!--配置Servlet-->
<servlet-name>HelloServlet</servlet-name>
<!--Servlet的名字,一般默认我们写类名-->
<servlet-class>com.testServlet.HelloServlet</servlet-class>
<!--我们Servlet的所在的位置-->
</servlet>
<servlet-mapping>
<!--Servlet的映射,告诉浏览器我的这个代码对应的哪一个页面-->
<servlet-name>HelloServlet</servlet-name>
<!--Servlet的名字跟前面对应-->
<url-pattern>/helloservlet</url-pattern>
<!--Servlet的访问地址-->
</servlet-mapping>
</web-app>
配置完后,再运行Tomcat,在输入我们的地址,就能访问我们的第一个Servlet了。
3.Servlet的生命周期
我们再来思考一个问题,我们整个过程其实是B/S通信过程,那浏览器的操作其实是传给我们的服务器的,
但如果多台计算机打开我们同一个页面,怎么保证每个人看见的是同一个页面,也就是要保证数据是同样的;
不可能说比如我看股票网站,不可能我两个人看同一支股的数据再不同页面看到的数据不一样,这样会乱套的。
所有我们就必须要保证所有浏览器访问的是同一个Servlet对象,所以我们一个Servlet只能存在一个对象。
也就是说Servlet对象是单例创造的!
这样就保证所有浏览器看到的是同一个实时的页面,但是B/S结构,是浏览器跟服务器的通信,跟我们Servlet并没有实际的关系,还记得我在前面说的Servlet的方法是由系统自动调用吗?
其实这里的"系统"不是指我们虚拟机而是指的我们的服务器,还有种说法叫做"容器",这里我们使用的Tomcat,所以是Tomcat创建的我们Servlet对象。
Tomcat并不是我们自己定义的,它只有通过反射的原理,来获取我们的Servlet并给它创建对象。
所以Servlet对象是由容器反射创建的!
然后我们来说一下Servlet的整个生命周期是怎样的:
1.容器(也就是服务器)启动,这样别人才能开始访问你的网页,当有第一次请求时,就创建Servlet对象
只创建一次,因为Servlet对象是单例的。
2.创建了对象,就会调用初始化函数init(),同样的init()只执行一次,只有创建对象时才调用
3.容器要解析浏览器发送的HTTP请求到底是干啥的,解析完之后根据不同的操作,去调用service()方法
每次请求都会去调用service()方法,然后把得到的响应信息,再响应给浏览器。
4.当容器关闭时,不是浏览器关闭!最后调用Dstory()方法,销毁Servlet对象,Servlet也就生命结束了。
到此,这篇文章到此结束,如果对Servlet还有兴趣,可以看下一篇文章对Servlet进行的一些优化。