欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Java web入门——Servlet

程序员文章站 2024-01-30 20:29:28
...

Java web入门——Servlet

Servlet基础

Servlet是运行在服务器上的java小程序,B/S架构的应用需要访问数据库、或一些逻辑处理,均由servlet进行处理,他用来扩充基于http协议的web服务器。
Servlet生命周期包括三部分:
初始化:Web容器加载servlet,调用init()方法
处理请求:当请求到达时,运行其service()方法。service()自动派遣运行与请求相对应的doXXX(doGet或者doPost)方法。
销毁:服务结束,web容器会调用servlet的distroy()方法销毁servlet。

Java web入门——Servlet
HTTP协议:
http协议属于应用层协议,那么基于TCP通信,分为非持续和持续型,客户端(一般是浏览器
)发起80端口(一般)http请求,位于指定ip的并且监听该端口的服务器进行响应。http方式指的则是GET、POST等动词,代表了对于url(统一资源定位符)和uri(统一资源标识符)的相关操作,http那么我们最熟悉的就是通过浏览器的地址栏,发送http请求,而地址栏填入的信息,例如www.baidu.com,就是发送向百度的ip地址所在的服务器请求页面,而地址栏的操作对应的http方式则是GET,目的是获取页面。而对于一个页面的请求http://localhost:8080/index?username=javatree,他能收到什么样的请求呢?

这是运行在我的电脑上的服务器所接受到的请求消息,那么第一行GET则是标志着对于url的操作,紧跟着的就是所获取资源的地址:/index,是从我们的localhost:8080后面开始的,localhost是本机地址,8080为服务器端口,后面跟着资源名,再后面则是对应的协议标准,使用HTTP/1.1协议

Servlet基本流程
最早支持 Servlet 技术的是 JavaSoft 的 Java Web Server。此后,一些其它的基于 Java 的 Web Server 开始支持标准的 Servlet API。Servlet 的主要功能在于交互式地浏览和修改数据,生成动态 Web 内容。这个过程为:
1. 客户端发送请求至服务器端;
2. 服务器将请求信息发送至 (对应的)Servlet;
3. Servlet 生成响应内容并将其传给服务器。响应内容动态生成,通常取决于客户端的请求;
4. 服务器将响应返回给客户端。
拿上面的图来举例子,服务器收到请求,解析出请求地址为/index,找到对应处理/index请求的servlet,然后找到对应处理GET请求的doGet函数,传入的参数存放在HttpServletRequest请求中,即我们的username,那么处理函数处理结束后,交给浏览器一个资源(页面,图片,xml数据),通过response交互,然后浏览器拿到服务器给的资源后显示在浏览器中,完成整个响应

Servlet常用对象
Request:封装用户提交信息,每次请求都会产生一个新的request,生命周期:一次请求,常用函数:
1. setAttribute()在Request域中存储数据
2. setCharacterEncoding()设置请求参数的编码方式,只对post请求有效
3. getMethod()获取请求类型
4. getParameter()获取指定请求参数值
5. getParameterNames()获取所有请求参数,返回一个Enumeration枚举类
6. getAttribute()获取域中存储的数据
7. getAttributeNames()获取域中所有数据,返回一个Enumeration枚举类
8. getContextPath()返回当前WEB项目相对路径
9. getCookies()获取所有Cookie,返回一个Cookie数组
10. getRequestDispatcher()获取转发器,参数路径以/打头,代表WebRoot(当前WEB项目根目录)
11. getSession()获取Session对象
Response:对客户的请求做出动态的响应,向客户端发送数据。生命周期:一次请求,常用函数:
1. setContentType()告知浏览器数据类型
2. setCharacterEncoding设置Response的编码方式
3. setHeader()设置消息头
4. setStatus()设置状态吗
5. addCookie()添加Cookie
6. sendRedirect()重定向
7. getOutputStream()获取通向浏览器的字节流(同一次请求处理中,字节流和字符流不能同时存在)
8. getWriter()获取通向浏览器的字符流(同一次请求处理中,字节流和字符流不能同时存在)
Session:一次会话,jsp内置对象,在jsp页面被装载后创建。生命期:从打开浏览器连接服务器开始,会为该次会话创建session,直到关闭浏览器结束。用途多在需要保存用户信息以供调用或一些需要较久保存的数据
ServletContext :应用程序开启到结束,共享

创建一个Servlet

创建servlet需要导入对应的java servlet-api包,并将想要成为servlet处理的类继承HttpServlet即可

添加路径映射
Servlet添加url到servlet有两种方法,第一种使用注解:

@WebServlet("/validateCodeCheck")
public class ValidateCodeCheck extends HttpServlet{
}

上例则是使用注解方式,在继承了httpservlet的类使用webservlet注解进行映射,所有请求/validateCodeCheck的请求都会在这个类进行执行,那么httpservlet较多被重写的函数有:
doPost,doGet,doHead(用的较少),
第二种:添加mapper
在web.xml下

<servlet>
    <servlet-name>LoginServlet</servlet-name>
    <servlet-class>javaServlet.LoginServlet</servlet-class>
</servlet>

Servlet-name是给下面的servlet-class起的名称,servlet-class则是处理的完整包路径+类名

<servlet-mapping>
    <servlet-name>LoginServlet</servlet-name>
    <url-pattern>/index</url-pattern>
</servlet-mapping>

添加映射,url-pattern则是想要映射到的地址,而servlet-name则是处理该请求的servlet名称,在上面的servlet定义的

private static final String METHOD_DELETE = "DELETE";
private static final String METHOD_HEAD = "HEAD";
private static final String METHOD_GET = "GET";
private static final String METHOD_OPTIONS = "OPTIONS";
private static final String METHOD_POST = "POST";
private static final String METHOD_PUT = "PUT";
private static final String METHOD_TRACE = "TRACE";

可以看到在httpservlet基类中定义了响应的method,只需要重写想要响应的请求对应的函数即可,比如在此例中我们重写doGet

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException,IOException {
        response.setContentType("text/html");
        PrintWriter pw = response.getWriter();
        response.sendRedirect("index.jsp");
    }

我们就能看到输出了在浏览器中输入的javatree,那么如何返回页面呢?

第一种:重定位(sendRedirect)
将页面重新定位至指定文件,这属于response的方法,通知服务器访问指定资源,但是当前请求结束,因此会发送新的request、response向转发资源,之前做的将不会继承到新资源的请求中去

第二种:请求转发(getRequestDispatch)
属于request方法,能够使用forward传递request和response,能够保留当前操作
示例:
注意调用的对象

request.setAttribute("username","javaTree");
response.sendRedirect("home.jsp");  //重定向
request.getRequestDispacther("home.jsp").forword(request,response); //请求转发

1、当用request.getRequestDispacther(“/index.jsp”).forword(request,response); 请求转发后,结果页面输出:javaTree

2、当用response.sendRedirect(“/index.jsp”);重定向后,结果页面输出:null

请求不同资源:
Jsp文件:
请求:

<form action="/validateCodeCheck" method="POST">

页面请求登录,重定向至index.jsp,浏览器收到服务器解析好的页面文件
图片:

<img alt="验证码" id="scode" src="<%=request.getContextPath() %>/getCode" >

通过图片io操作向response的输出流中写入图片,完成图片的响应

本次使用例子可以在此处找到

http://git.oschina.net/Efin/Servlet

相关知识点面试题:
1、说一说Servlet生命周期
Servlet生命周期包括三部分:
初始化:Web容器加载servlet,调用init()方法
处理请求:当请求到达时,运行其service()方法。service()自动派遣运行与请求相对应的doXXX(doGet或者doPost)方法。
销毁:服务结束,web容器会调用servlet的distroy()方法销毁servlet。

2、Post和Get在servlet处理中有何区别
POST在doPost中处理,GET在doGet中处理,也可以将doGet和doPost合并转发至同一个处理函数中

3、转发与重定向的区别
针对浏览器:转发不会改变浏览器的地址,因为是在一个request完成,因此浏览器会将其作为一次请求,在服务器中中转。重定向会改变浏览器地址,是由服务器指示浏览器转到某个地址发送请求,因此是两次请求
针对服务器:转发可以保存原请求的request和response对象,而重定向不能获得
效率:转发是在服务器完成,省去通信以及网络传输时间,因此效率较高,而重定向有两次请求,效率较低

4、 编写Servlet需要继承的类是什么?
HttpServlet

5、编写Servlet通常需要实现的两个方法是什么?
doGet方法和doPost方法

6、要获取用户信息,如何获取
request的getParameter方法和getParameterValues方法,前者用于获取单值表单元素的值,后者用于获取多值的情况,典型的复选框。前者返回的是一个字符串,后者返回的是字符串数组。如果参数指定的表单元素不存在,返回null。

7、如何配置servlet
第一种方法:注解,通过类名前添加WebServlet(“/xxx”)
第二种方法:配置web.xml,包括两步
Servlet的声明:

<servlet>
<servlet-name>servlet的名字(自己定义的)</servlet-name>
<servlet-class>servlet的完整类名</servlet-class>
</servlet>

Servlet访问方式的声明

<servlet-mapping>
<servlet-name>Servlet的名字(应该和声明的时候保持一致)</servlet>
<url-pattern>访问路径</url-pattern>
</servlet-mapping>