Java web入门——Servlet
Java web入门——Servlet
Servlet基础
Servlet是运行在服务器上的java小程序,B/S架构的应用需要访问数据库、或一些逻辑处理,均由servlet进行处理,他用来扩充基于http协议的web服务器。
Servlet生命周期包括三部分:
初始化:Web容器加载servlet,调用init()方法
处理请求:当请求到达时,运行其service()方法。service()自动派遣运行与请求相对应的doXXX(doGet或者doPost)方法。
销毁:服务结束,web容器会调用servlet的distroy()方法销毁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的输出流中写入图片,完成图片的响应
本次使用例子可以在此处找到
相关知识点面试题:
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>