1.HttpSerlvet常用方法
getServletContext():获取ServletContext对象,即JSP内置对象中的application对象。
getServletName():获取Servlet配置时声明在Web应用内部使用的名字。
getInitParameter(String name):获取Servlet配置时提供的名为name的参数值。
2.HttpSerlvetRequest常用方法
getRequestURL():获取请求的URL地址,包括协议名,服务器名,端口号和所请求服务的路径,但不包含请求时所带的参数。
getRequestURI():获取所请求服务的路径。
getContextPath():获取Web应用的根路径。
getServletPath():获取Servlet的访问地址。
getParameter(String name):获得名为name的参数的单个值。
getParameterValues(String name):获得名为name的参数的多个值。
getAttribute(String name):获得名为name的属性值。
setAttribute(String name,String value):设置名为name的属性值为value。
getSession():获取session对象。
getRequestDispatcher(String path):获取请求转发对象,转向地址为path。所获得的RequestDispatcher对象的forward()方法实现真正的跳转。
3.HttpSerlvetResponse常用方法
setContentType(String type):设置响应的内容类型为type。
setCharacterEncoding(String charset):设置响应的编码字符集为charset。
getWriter():返回一个PrintWriter对象,利用这个对象可以向客户端输出文本,这个对象的作用类似于JSP的内置对象out。
sendRedirect(String location):向客户端发送一个重定向请求,地址为location。
4.ServletConfig常用方法
(1)获取Servlet的初始化参数
在web.xml文件中,<init-param>元素的相关配置代表Servlet的初始化参数,通过getInitParameter()方法来完成的。
(2)获取Servlet初始化参数名
<param-name>元素的值即为Servlet初始化参数名。通过getInitParameterNames()方法来完成。
(3)获取Servlet名称
通过getServletName()方法来获取Servlet在web.xml文件中的注册名称
5.获取服务器端信息的方法
服务器端信息包括服务器名、服务器端口号、服务器的属性信息等,Servlet通过ServletContext和ServletRequest接口提供的相关方法可获取这些服务器端信息
接口 | 方法名称 | 作用 |
ServletRequest | String getServerName() | 获取服务器名 |
int getServerPort() | 获取服务器端口号 | |
ServletContext | String getServerInfo() | 获取服务器信息 |
Enumeration getAttributeNames() | 获取服务器属性名 | |
Object getAttribute(String name) | 获取服务器属性值 | |
int getMajorVersion() | 获取服务器支持的Servlet的主版本号 | |
int getMinorVersion() | 获取服务器支持的Servlet的次版本号 |
【案例5-4】 获取服务器端信息
package ch5;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Enumeration;
import javax.servlet.GenericServlet;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebServlet;
@WebServlet(description = "ServerInfoServlet", urlPatterns = { "/servlet/ServerInfoServlet" })
public class ServerInfoServlet extends GenericServlet{
public void service(ServletRequest req, ServletResponse res)
throws ServletException, IOException {
ServletContext servletContext=getServletContext(); //获取Servlet上下文
res.setCharacterEncoding("UTF-8"); //设置响应的编码类型为UTF-8
res.setContentType("text/html;charset=UTF-8");
PrintWriter out=res.getWriter(); //获取输出对象
out.println("<h2>服务器端信息列表</h2>");
out.println("<table border='1'>");
out.println("<tr>");
out.println("<td>服务器名</td>");
out.println("<td>"+req.getServerName()+"</td>");
out.println("</tr>");
out.println("<tr>");
out.println("<td>服务器端口号</td>");
out.println("<td>"+req.getServerPort()+"</td>");
out.println("</tr>");
out.println("<tr>");
out.println("<td>服务器信息</td>");
out.println("<td>"+servletContext.getServerInfo()+"</td>");
out.println("</tr>");
out.println("<tr>");
out.println("<td>主版本号</td>");
out.println("<td>"+servletContext.getMajorVersion()+"</td>");
out.println("</tr>");
out.println("<tr>");
out.println("<td>次版本号</td>");
out.println("<td>"+servletContext.getMinorVersion()+"</td>");
out.println("</tr>");
out.println("<tr>");
out.println("<td>服务器属性</td>");
Enumeration<String> params = servletContext.getAttributeNames();
String param="";
while (params.hasMoreElements()){
param += (String)params.nextElement()+"<br/>";
}
out.println("<td>"+param+"</td>");
out.println("</tr>");
out.println("</table>");
out.close(); //关闭输出对象
}
}

6.获取客户端信息的方法
客户端信息包括客户端主机名、客户端IP地址、客户端端口号、客户端的请求参数等,Servlet通过ServletRequest接口或其子接口HttpServletRequest提供的相关方法可获取客户端信息
序号 | 方法名 | 作用 |
1 | String getRemoteHost() | 获取客户端主机名 |
2 | String getRemoteAddr() | 获取客户端IP地址 |
3 | int getRemotePort() | 获取客户端端口号 |
4 | String getProtocol() | 获取客户端请求协议 |
5 | String getCharacterEncoding() | 获取客户端请求的编码格式 |
6 | Enumeration getParameterNames() | 获取客户端请求的所有参数名 |
7 | String getParameter(String name) | 获取客户端请求的参数名获取参数值 |
【案例5-5】获取客户端信息。
package ch5;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet(description = "ClientInfoServlet", urlPatterns = { "/servlet/ClientInfoServlet" })
public class ClientInfoServlet extends HttpServlet{
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
this.doPost(req, resp);
}
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
resp.setCharacterEncoding("UTF-8"); //设置响应的编码类型为UTF-8
response.setContentType("text/html;charset=UTF-8");
PrintWriter out=resp.getWriter(); //获取输出对象
out.println("<h2>客户端信息列表</h2>");
out.println("<table border='1'>");
out.println("<tr>");
out.println("<td>客户端主机名</td>");
out.println("<td>"+req.getRemoteHost()+"</td>");
out.println("</tr>");
out.println("<tr>");
out.println("<td>客户端IP地址</td>");
out.println("<td>"+req.getRemoteAddr()+"</td>");
out.println("</tr>");
out.println("<tr>");
out.println("<td>客户端端口号</td>");
out.println("<td>"+req.getLocalPort()+"</td>");
out.println("</tr>");
out.println("<tr>");
out.println("<td>客户端请求方式</td>");
out.println("<td>"+req.getMethod()+"</td>");
out.println("</tr>");
out.println("<tr>");
out.println("<td>客户端请求协议</td>");
out.println("<td>"+req.getProtocol()+"</td>");
out.println("</tr>");
out.println("<tr>");
out.println("<td>客户端请求编码格式</td>");
out.println("<td>"+req.getCharacterEncoding()+"</td>");
out.println("</tr>");
out.println("</table>");
out.close();//关闭输出对象
}
}

7.HttpSession的相关方法
(1)获取HttpSession对象
public HttpSession getSession()
public HttpSession getSession(Boolean create)
(2)在HttpSession对象中保存数据
public void setAttribute(String name,Object value)
参数name是绑定到会话中的属性名称,参数value是属性的值。
(3)在HttpSession对象中读取数据
public Object getAttribute(String name)
参数name的值为setAttribute(String name,Object value)方法中设置的name的值。
(4)HttpSession 的实际应用
其工作原理是这样的:
a.当一个用户向服务器发送第一个请求时,服务器为其建立一个session,并为此session创建一个标识号sessionId;
b.这个用户随后的所有请求都应包括这个标识号。服务器会校对这个标识号以判断请求属于哪个session。
当需要为用户端建立一个session时,servlet容器就创建了一个HttpSession对象。其中存储了和本session相关的信息。所以,在一个servlet中有多少个不同用户连接,就会有多少个HttpSession对象。
【案例5-6】结合JavaBean技术,使用HttpSession模拟购物车的信息保存
程序结构如图所示,Book.java是JavaBean,Db.java用来模拟数据库,ListBookServlet.java用于列出所有商品,点击购买将调用BuyServlet.java文件,ListCarServlet.java是购物车页面(点击购买了多少书本,就展示多少书本)。

Book.java:
package ch5.shopping;
public class Book {
private String id;
private String name;
private String author;
private double price;
public Book(String id, String name, String author, double price) {
this.id = id;
this.name = name;
this.author = author;
this.price = price;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
}
Db.java:
package ch5.shopping;
import java.util.LinkedHashMap;
import java.util.Map;
/**
* 模拟一个保存Book的数据库
*/
public class Db {
private static Map<String,Book> map=new LinkedHashMap<String,Book>();
static{
map.put("1", new Book("1","《spring实战","沃尔斯(Craig Walls)",66));
map.put("2", new Book("2","《大型分布式网站架构设计与实践","陈康贤",79));
map.put("3", new Book("3","《一线架构师实践指南》","温昱",35));
map.put("4", new Book("4","《高性能网站构建实践》","刘鑫",88));
map.put("5", new Book("5","《淘宝技术这十年》","子柳",45));
}
public static Map getAll(){
return map;
}
public static void main(String[] args) {
Map<String,Book> map=Db.getAll(); //获取模拟数据库Db的所有Book数据
for(Map.Entry<String, Book> entry:map.entrySet()){
Book book=entry.getValue();
System.out.println(book.getName()+"<a href='BuyServlet?id="+book.getId()+"' target='_blank' >购买</a><br/>");
}
}
}
ListBookServlet.java:
package ch5.shopping;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Map;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* 购买页面
* 模拟网站首页 列出所有书本
*/
@WebServlet("/ListBookServlet")
public class ListBookServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
public ListBookServlet() {
super();
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=UTF-8");
PrintWriter out =response.getWriter();
out.println("本站有如下书籍<br/>");
Map<String,Book> map=Db.getAll(); //获取模拟数据库Db的所有Book数据
for(Map.Entry<String, Book> entry:map.entrySet()){
Book book=entry.getValue();
//点击“购买”后跳转至BuyServlet处理,并带上对应的书本Id
out.print(book.getName()+"<a href='BuyServlet?id="+book.getId()+"' target='_blank' >购买</a><br/>");
}
out.println("<a href='ListCarServlet'>查看购物车</a>");
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
}
BuyServlet.java:
package ch5.shopping;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
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 javax.servlet.http.HttpSession;
//点击购买
@WebServlet("/BuyServlet")
public class BuyServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
public BuyServlet() {
super();
}
//ListBookServlet点击购买后跳转到这里
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String id=request.getParameter("id"); //获取书本的Id
Book book=(Book) Db.getAll().get(id); //根据Id查找“数据库”对应的书,即本次购买的书
HttpSession session=request.getSession();
//从Session得到用户用于保存所有书的集合(购物车)
List<Book> list = (List) session.getAttribute("listBook"); //首次购买这里没有数据
if(list==null){ //如果是首次购买
list=new ArrayList(); //新建一个List
session.setAttribute("listBook", list); //将购买的书本放入Session
}
list.add(book); //每多购买一本,就在List中多添加一本书
//request.getRequestDispatcher("/ListCarServlet").forward(request, response); //转发会导致页面在刷新时不断购买刚刚购买的商品
response.sendRedirect(request.getContextPath()+"/ListCarServlet"); //重定向:可以避免刷新时重复购买的情况
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
}
ListCarServlet.java:
package ch5.shopping;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.List;
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 javax.servlet.http.HttpSession;
/**
* 模拟购物车的页面展示
*/
@WebServlet("/ListCarServlet")
public class ListCarServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
public ListCarServlet() {
super();
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=UTF-8");
PrintWriter out =response.getWriter();
HttpSession session =request.getSession(false); //获取Session
if(session==null){ //如果Session中为空
out.write("您没有购买任何商品!!!");
return ;
}
out.write("您购买了如下商品:<br/>");
List<Book> list=(List) session.getAttribute("listBook"); //如果Session不为空,提取对应的Session中的数据
for(Book book:list){
out.write(book.getName()+"<br/>"); //将提取的数据进行展示
}
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
}

点击购买后,跳至购物车页面,支持多次点击购买。


