Java web(Servlet技术基础)
Posted godlikeyt
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java web(Servlet技术基础)相关的知识,希望对你有一定的参考价值。
1.Servlet技术
1.1 Servlet概述:
什么是Servlet:它是运行在web服务器端的一个Java小程序,简单来说,它就是一个Java类。 在使用Servlet时,需要导入javax.servlet下的jar包。比如:Tomcat服务器 提供了Servlet的servlet-api.jar包,所以在开发时用Tomcat服务器就不需要
再导入Servlet的jar包。
Servlet它是一个资源,是用来被用户访问的资源,同时是一个动态资源,它是由sun公司指定的Servlet规范。
Servlet的作用:它是基于HTTP协议的,主要是接受客户端发送的请求,处理请求,把数据响应给客户端。
1.2 Servlet的入门
1.Servlet的接口和实现类:
>>>Servlet它是一个接口,在javax.servlet包下面。
五个方法:
*destory():执行这个方法,销毁了Servlet对象。
*init(ServletConfig config):在web服务器创建Servlet对象以后,执行这个初始化方法。
*service(ServletRequest req,ServletResponse res):服务方法,用来接收客户端发送的请求,并且响应数据到客户端。
*getServletConfig()
*getServletInfo():Servlet的信息,比如作者,版本和版权,这个方法在开发中不用。
>>>GenericServlet,它是一个类,实现了Servlet接口。
>>>HttpServlet,它是一个类,实现了Servlet接口,同时继承了GenericServlet。
2.创建Servlet的三种方式
>>>直接实现Servlet接口。
>>>继承GenericServlet类。
>>>继承HttpServlet类。
一般在开发中,创建Servlet,通常去继承HttpServlet类。
比如:class MyServlet extends HttpServlet {重写所需要的方法}
1.3 实现第一个Servlet程序
>>>1.自己手动创建Servlet,通过Dos命令窗口编译Servlet,把编译好的class文件部署到Tomcat服务器运行。
>>>2.通过Intellij IDEA创建Servlet,部署到Tomcat服务器,然后就可以访问所需要的Servlet。
步骤:
1.创建MyServlet,继承GenericServlet
2.重写父类GenericServlet的servlet方法
3.在服务方法里面,处理客户端请求后,把数据响应给客户端
访问Servlet,提供servlet的访问路径:
比如
package HelloWorld;
import java.io.*;
import javax.servlet.GenericServlet;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
public class MyServlet extends GenericServlet {
@Override
public void service(ServletRequest arg0,ServletResponse response)
throws SecurityException,IOException {
//处理客户端发送的请求,并且把数据响应给客户端
System.out.println("接收了客户端请求------");
//把数据响应给客户端,与浏览器绑定的输出流,作用向浏览器输出数据
PrintWriter pw = response.getWriter();
pw.print("Hello World");
}
}
<!--配置/hello,访问的Servlet-->
<servlet>
<servlet-name>MyServlet</servlet-name>
<servlet-class>HelloWorld.MyServlet</servlet-class>
</servlet>
<!--配置浏览器访问Servlet的路径-->
<servlet-mapping>
<servlet-name>MyServlet</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
访问:http://localhost:8080/test1/hello
就找到对应的MyServlet,把数据响应给浏览器
1.4 Servlet的生命周期
生命周期:自然界人从出生到最终死亡,这个周期过程就是生命周期。
其实Servlet的生命周期和人一样,从Servlet对象被创建,经过使用Servlet对象,
到最终Servlet对象被销毁,整个过程就是Servlet的生命周期。
与生命周期相关的三个方法:
>>>init(ServletConfig config) 初始化方法:首次访问这个Servlet,Servlet对象会被创建,执行初始化方法。
>>>service(ServletRequest req,ServletResponse res) 服务方法:每次访问Servlet时,服务方法都会被执行。
>>>destroy() 销毁方法:在服务器正常关闭时,会执行销毁方法,执行一次。
比如:
package HelloWorld;
import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet(name = "LifeServlet")
public class LifeServlet extends GenericServlet {
@Override
public void init(ServletConfig config) throws ServletException {
System.out.println("首次访问LifeServlet时,会执行这个初始化方法------");
}
@Override
public void service(ServletRequest arg0, ServletResponse arg1) throws ServletException,IOException {
System.out.println("每次访问LifeServlet时,都会执行这个服务方法------");
}
@Override
public void destroy() {
System.out.println("在服务器关闭时,会执行销毁方法");
}
}
在web.xml文件里面配置访问路径:
<servlet>
<servlet-name>LifeServlet</servlet-name>
<servlet-class>HelloWorld.LifeServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>LifeServlet</servlet-name>
<url-pattern>/life</url-pattern>
</servlet-mapping>
1.5 Servlet应用--HttpServlet
1.在开发中,通常浏览器访问web服务器端的资源,是带有协议的访问,比如说http协议、https协议等,
所以说在创建Servlet时,需要使用带有协议的Servlet,那么我们在创建Servlet时,通常继承HttpServlet的方式来实现。
2.查看HttpServlet源码得到的结论:
在HttpServlet里面重写service时,因为在service方法里面,最终调用doGet或者doPost方法,
所以说在重写服务方法时,一般情况下不会重写service方法,而是直接重写doGet和doPost方法,
在客户端发送get请求,在服务器端就用doGet方法接收,
在客户端发送Post请求,在服务端就用doPost方法接收。
在开发中,注意的细节:
>>>1.在使用对象时,使用带有协议的请求和响应对象HttpServletRequest和HttpServletResponse
>>>2.在开发时,继承HttpServlet时,直接重写doGet和doPost方法,而不是重写service方法
比如:
--form.html--
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="http://localhost:8080/test1/myHttpServlet" method="get">
用户名:<input type="text" name="username"> <br/>
密码:<input type="password" name="password"> <br/>
<input type="submit" value="get请求方式">
</form>
<hr size="2" color="red">
<form action="http://localhost:8080/test1/myHttpServlet" method="post">
用户名:<input type="text" name="username"> <br/>
密码:<input type="password" name="password"> <br/>
<input type="submit" value="post请求方式">
</form>
</body>
</html>
--myHttpServlet.java--
package HelloWorld;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet(name = "myHttpServlet")
public class myHttpServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String method=request.getMethod();
System.out.println(method);
System.out.println("这是发送的post请求");
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String method=request.getMethod();
System.out.println(method);
System.out.println("这是发送的get请求");
}
}
--XML文件配置--
<servlet>
<servlet-name>MyHttpServlet</servlet-name>
<servlet-class>HelloWorld.myHttpServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>MyHttpServlet</servlet-name>
<url-pattern>/myHttpServlet</url-pattern>
</servlet-mapping>
1.6 在idea中创建Servlet
通过开发工具创建Servlet有两种方式:
>>>1.先创建一个普通的Java类,需要去实现Servlet接口,或者继承对应的HttpServlet(GenericServlet)类,
普通的Java类就具有了Servlet功能,所以需要手动在web.xml配置文件中添加访问Servlet的路径信息。
>>>2.直接创建Servlet。会自动在web.xml文件中添加访问Servlet的路径信息。
步骤:
1.新建web项目:
比如,创建一个web项目,命名:test03
2.创建一个Servlet程序:
比如:先创建一个包,名称cn.itcast.servlet,Servlet名称:ServletTest03
3.部署和访问Servlet:
通过开发工具部署web项目,如test03,访问它下面的Servlet资源:
访问地址:http://localhost:8080/test03/ServletTest03
注意:一般情况下,为了简化开发,我们会在doPost方法里面调用doGet方法:
/*doPost方法,用来接收浏览器发送的Post请求*/
protected void doPost(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response) throws javax.servlet.ServletException, IOException {
this.doGet(request,response);
}
/*doGet方法,用来接收浏览器发送的get请求*/
protected void doGet(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response) throws javax.servlet.ServletException, IOException {
PrintWriter out=response.getWriter();
out.print("this servlet is created by idea");
}
xml.web文件配置:
<servlet>
<servlet-name>ServletTest03</servlet-name>
<servlet-class>cn.itcast.servlet.ServletTest03</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ServletTest03</servlet-name>
<url-pattern>/ServletTest03</url-pattern>
</servlet-mapping>
1.7 实现Servlet的虚拟路径映射
1.Servlet的多重映射:一个Servlet,可以对应多个访问路径,
比如:一个Servlet对应的访问路径:/ServletTest03、/Test01、/Test02
<servlet-mapping>
<servlet-name>ServletTest03</servlet-name>
<url-pattern>/ServletTest03</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>ServletTest03</servlet-name>
<url-pattern>/Test01</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>ServletTest03</servlet-name>
<url-pattern>/Test02</url-pattern>
</servlet-mapping>
2.Servlet的映射路径可以使用通配符
Servlet的映射路径有三种方式:
>>>完全目录匹配:比如 /Test01
>>>目录匹配:比如 /abc/* 或者 /*
>>>拓展名匹配: *.do,*.action 注意:/*.do这种写法是错误的
优先级:完全目录匹配>目录匹配>拓展名匹配
3.缺省Servlet
什么是缺省Servlet:它的映射路径“/”,代表这是一个缺省的Servlet。
缺省Servlet作用:处理请求的资源找不到的问题(404代表请求的资源找不到)
1.8 ServletConfig接口
什么是ServletConfig:它是Servlet的配置对象,作用就是获取与Servlet的初始化参数。
它的子类是GenericServlet和HttpServlet。
它被实例化通过web服务器实现的。
得到ServletConfig对象:getServletConfig();
ServletConfig常用方法:
>>>1.获取Servlet的初始化参数的值:getInitParameter(String name);根据encoding获取utf-8。
>>>2.获取Servlet初始化参数的名称:getInitParameterNames();获取encoding和username等名称。
>>>3.得到ServletContext对象:getServletContext();
>>>4.获取Servlet的名称:getServletName();对应web.xml里面<servlet-name>TestServlet08</servlet-name>
初始化参数配置:
<!--Servlet初始化参数配置-->
<init-param>
<param-name>encoding</param-name>
<param-value>utf-8</param-value>
</init-param>
<init-param>
<param-name>username</param-name>
<param-value>godlike</param-value>
</init-param>
代码:
public class TestServlet08 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doGet(request,response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1.得到ServletConfig对象
ServletConfig config=this.getServletConfig();
//2.获取Servlet的名称,对应web.xml里面<servlet-name>TestServlet08</servlet-name>
String servletName=config.getServletName();
System.out.println("Servlet的名称:"+servletName);
//3.获取Servlet的初始化参数
String value=config.getInitParameter("encoding");
System.out.println("初始化参数的值:"+value);
//4.获取Servlet的初始化参数名称
Enumeration<String> er= config.getInitParameterNames();
while (er.hasMoreElements()) {
//获取初始化参数的名称
String name=er.nextElement();
//根据初始化参数的名称,获取对应的值
String name1=config.getInitParameter(name);
System.out.print("初始化参数的名称:"+name);
System.out.println("该名称对应的值:"+name1);
}
}
}
1.9 ServletContext接口
ServletContext对象是在web服务器启动时就创建了,是web服务器创建的ServletContext对象。
每一个web项目只有一个ServletContext对象。
ServletContext对象的作用:获取web应用程序初始化参数,在web应用程序能共享数据,获取web项目下的资源文件。
得到ServletContext对象:
>>>1.通过ServletConfig对象获取:config.getServletContext()
>>>2.直接获取:getServletContext()
1.获取web应用程序的初始化参数
>>>1.获取全局初始化参数的值:getInitParameter(String name)
>>>2.获取全局初始化参数的名称:getInitParameterNames()
比如:
全局初始化参数配置:
<!--配置全局初始化参数-->
<context-param>
<param-name>AAA</param-name>
<param-value>aaa</param-value>
</context-param>
<context-param>
<param-name>BBB</param-name>
<param-value>bbb</param-value>
</context-param>
代码:
public class TestServlet09 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doGet(request,response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1.得到ServletContext对象
ServletContext context=this.getServletContext();
//2.获取全局初始化参数
Enumeration <String> er=context.getInitParameterNames();
while (er.hasMoreElements()) {
String name=er.nextElement();
String value=context.getInitParameter(name);
System.out.print("初始化参数名称:"+name);
System.out.println(" 初始化参数的值"+value);
}
}
}
2.实现多个Servlet对象之间共享数据:因为一个web项目只有一个ServletContext对象。
ServletContext对象就是域对象:域对象在一定范围内能存值和取值。
域对象相关的方法:
*存值:void setAttribute(String key,Object obj);
*取值:Object obj=getAttribute(key);
*删除值:void removeAttribute(key);
比如:在Servlet01里面存值:
//1.获取ServletContext对象
ServletContext context=this.getServletContext();
//2.存值
context.setAttribute("key","Servlet01里存的值");
在Servlet02里面获取值:
//1.获取ServletContext对象
ServletContext context=this.getServletContext();
//2.从ServletContext取值
Object object=context.getAttribute("key");
String value=object.toString();
response.setContentType("text/html;charset=utf-8");
response.getWriter().print(value);
3.获取web项目下面的资源文件
通过ServletContext对象能够获取web项目下面文件的字节输入流,或者文件的绝对路径。
路径问题:
普通Java项目:直接使用jdk编译Java文件,所以说文件的路径是相对于工作空间。
比如:
Proerties pro=new Proerties();
InputStream inStream=new FileInputStream("src/config.properties");
pro.load(inStream);
String value=pro.getProperty("key");
Sysyem.out.println(value);
web项目:运行在Tomcat服务器上面,所以说文件的路径是相对于Tomcat服务器。
服务器端没有src这个目录,写路径不能写src,必须相对于Tomcat服务器端的路径。
1.获取文件自己的输出流:路径是相对于Tomcat服务器路径
InputStream in =getResourceAsStream(String path)
以上是关于Java web(Servlet技术基础)的主要内容,如果未能解决你的问题,请参考以下文章