2、servlet
2.1 定义:servlet是一个运行在web服务器或者应用服务器上的一个小程序,处理请求和发送相应的过程是用它来完成的,它是为了解决实现动态页面而衍生的。
2.2 生命周期:servlet有良好的生存期的定义,包括加载和实例化、初始化、处理请求以及服务结束。这个生存期由javax.sevlet.Servlet接口的init、servlet和destroy方式表达。
2.2.1 调用 init () 方法进行初始化
2.2.2 调用 service() 方法来处理客户端的请求。
2.2.3 通过调用 destroy() 方法终止(结束)
2.3 基本构架:
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class ServletName extends HttpServlet{
private static final long serialVersionUID = 1L;
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
super.doGet(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
super.doPost(req, resp);
}
}
2.4 servlet api中forward和redirect区别
2.4.1 调用方式不同
forward():request.getRequestDispatcher("user.jsp").forward(req, resp); //转发
redirect():response.sendRedirect("user.jsp"); //重定向
2.4.2 地址栏显示不同
forward():服务器请求资源,服务器直接访问目标地址的URL,把那个URL的响应内容读取过来,然后把这些内容再发给浏览器.浏览器根本不知道服务器发送的内容从哪里来的,所以它的地址栏还是原来的地址。即在客户端浏览器地址栏中不会显示出转向后的地址。
redirect():服务端根据逻辑,发送一个状态码,告诉浏览器重新去请求那个地址.所以地址栏显示的是新的URL.所以redirect等于客户端向服务器端发出两次request,同时也接受两次response。即浏览器将会得到跳转的地址,并重新发送请求链接。
2.4.3 数据共享:
forward():转发页面和转发到的页面可以共享request里面的数据。
redirect():不能共享数据。因为重定向可以访问自己web应用以外的资源,在重定向的过程中,传输的信息会被丢失。
2.4.4 高效性:
forward():效率高
redirect():效率低
2.4.5 在jsp中使用
forward():<jsp:forward page="user.jsp" />
redirect():<%response.sendRedirect("user.jsp"); %>
2.5 什么情况下调用doGet()和doPost()方法?
jsp页面的form标签里的method属性对应相应的方法调用。
2.6 request对象的主要方法:
? setAttribute(String name,Object):设置名字为name的request 的参数值
? getAttribute(String name) :返回由name指定的属性值
? getAttributeNames() :返回request 对象所有属性的名字集合,结果是一个枚举的实例
? getCookies() :返回客户端的所有 Cookie 对象,结果是一个Cookie 数组
? getCharacterEncoding() :返回请求中的字符编码方式
? getContentLength() :返回请求的 Body的长度
? getHeader(String name) :获得HTTP协议定义的文件头信息
? getHeaders(String name) :返回指定名字的request Header 的所有值,结果是一个枚举的实例
? getHeaderNames() :返回所以request Header 的名字,结果是一个枚举的实例
? getInputStream() :返回请求的输入流,用于获得请求中的数据
? getMethod() :获得客户端向服务器端传送数据的方法
? getParameter(String name) :获得客户端传送给服务器端的有 name指定的参数值
? getParameterNames() :获得客户端传送给服务器端的所有参数的名字,结果是一个枚举的实
? getParameterValues(String name):获得有name指定的参数的所有值
? getProtocol() :获取客户端向服务器端传送数据所依据的协议名称
? getQueryString() :获得查询字符串
? getRequestURI() :获取发出请求字符串的客户端地址
? getRemoteAddr() :获取客户端的 IP 地址
? getRemoteHost() :获取客户端的名字
? getSession([Boolean create]) :返回和请求相关 Session
? getServerName() :获取服务器的名字
? getServletPath() :获取客户端所请求的脚本文件的路径
? getServerPort() :获取服务器的端口号
? removeAttribute(String name) :删除请求中的一个属性
2.7 setAttribute()和getParameterNames() 的区别:
2.7.1 getParameter得到的都是String类型的。或者是http://a.jsp id=123中的123,或者是某个表单提交过去的数据;
getAttribute则可以是对象。
2.7.2 getParameter()是获取POST/GET传递的参数值;
getAttribute()是获取对象容器中的数据值。
2.7.3 当两个Web组件之间为链接关系时,被链接的组件通过getParameter()方法来获得请求参数;
当两个Web组件之间为转发关系时,转发目标组件通过getAttribute()方法来和转发源组件共享 request范围内的数据。
例子:
①当要从 1.jsp 链接到 2.jsp 时,被链接的是2.jsp可以通过getParameter()方法来获得请求参数.
假如1.jsp里有
<form name="form1" method="post" action="2.jsp">
请输入用户姓名:<input type="text" name="username">
<input type="submit" name="Submit" value="提交">
</form>
在2.jsp中通过request.getParameter("username")方法来获得请求参数username:
<% String username=request.getParameter("username"); %>
②如果两个WEB间为转发关系时,转发目的WEB可以用getAttribute()方法来和转发源WEB共享request范围内的数据.
1.jsp希望向2.jsp传递名字:
<%
String username=request.getParameter("username");
request.setAttribute("username",username);
%>
<jsp:forward page="2.jsp" />
2.jsp通过getAttribute()方法获得用户名字:
<% String username=(String)request.getAttribute("username"); %>
原文:https://www.cnblogs.com/Tibbers/p/12912342.html