举例:管理cookie
首先创建index.jsp页面,从request对象中获取cookie,判断是否含有此服务器发来的cookie。如果没有说明是第一次访问本站;如果有则直接将值读取出来,并赋给对应的表单。关键代码如下:
<%
String welcome="第一次访问";
String[] info=new String[]{" "," "," "};
Cookie[] cook=request.getCookies();
if(cook!=null)
{
for(int i=0;i<cook.length;i++){
if(cook[i].getName().equals("mrCookInfo")){
info=cook[i].getValue().split("#");
welcome=",欢迎回来!";
}
}
}
%>
<%=info[0]+welcome %>
<form action="show.jsp" method="post">
<ul style="line-height:2">
<li>姓名:<input name="name" type="text" value="<%=info[0]%>">
<li>生日:<input name="birthday" type="text" value="<%=info[1]%>">
<li>邮箱:<input name="mail" type="text" value="<%=info[2]%>">
<li><input type="submit" value="提交">
</ul>
接下来创建show.jsp页面,在该页面中通过request对象将用户输入的表单信息提取出来,创建一个cookie对象,并通过response对象的addCookie()方法将其发送到客户端。
<%
String name=request.getParameter("name");
String birthday=request.getParameter("birthday");
String mail=request.getParameter("mail");
Cookie myCook=new Cookie("mrCookInfo",name+"#"+birthday+"#"+mail);
myCook.setMaxAge(60*60*24*365);
response.addCookie(myCook);
%>
表单提交成功
<ul style="line-height:2px">
<li>姓名:<%=name %>
<li>生日:<%=birthday %>
<li>邮箱:<%=mail %>
<li><a href="index.jsp">返回</a>
结果如下:第一次访问页面时用户表单中的信息是空的,当用户提交过一次表单之后,表单中的内容就会被记录到cookie对象中,再次访问的时候会从cookie中获取用户输入的表单信息并显示在表单中,如下图所示:
responese对象
respone代表的是对客户端的响应,主要是将JSP容器处理过的对象传回到客户端。response对象也具有作用域,它只在JSP页面内有效。response 对象常用方法如下:
方法 |
返回值 |
说明 |
addHeader(String name,String value) |
void |
添加HTTP头文件,如果同名的头存在,则覆盖 |
setHaeder(String name,String value) |
void |
设定指定名称的文件并头的值,如果存在则覆盖 |
addCookie(Cookie cookie) |
void |
向客户端添加一个cookie对象 |
sendError(int sc,String msg) |
void |
向客户端发送错误信息。例如:404 网页找不到 |
sendRedirect(String location) |
void |
发送请求到另一个指定位置 |
getOutputStream() |
ServletOutputStream |
获取客户端输出流对象 |
setBufferSize(int size) |
void |
设置缓冲区大小 |
重定向网页:通过使用sendRedirect()方法,将响应发送到另一个指定的位置进行处理。重定向可以将地址重新定向到不同的主机上,在客户端浏览器上将会得到跳转的地址,并重新发送请求连接。用户可以从浏览器的地址栏中看到跳转后的地址。进行重定向操作后,request 中的属性全部消失,并且进入一个新的request 对象的作用域。例如:
response.sendRedirect(“www.baidu.com”)
处理HTTP头文件:setHeader()方法设置HTTP头文件。
例如:设置网页没5秒自动刷新一次
response.setHeader(“refresh”,”5”);
例如:设置2秒钟后自动跳转到制定的页面
response.setHeader(“refresh”,”2;URL=welcome.jsp”)
设置输出缓冲:通常情况下,服务器要输出到客户端的内容不会直接写到客户端,而是先写到一个输出缓冲区;只有在以下三种情况下才会把缓冲区的内容写到客户端。
- JSP页面的输出信息已经全部写到了缓冲区;
- 缓冲区已满;
- 在JSP页面中调用了flushbuffer()方法或out对象的flush()方法。
使用response对象的setBufferSize()方法可以设置缓冲区的大小。例如设置其大小为0,即不缓冲。
response.setBufferSize(0);
session对象
session对象是由服务器自动创建的与用户请求相关的对象。服务器为每个用户都生成一个session对象,用于保护该用户的信息,跟踪用户的操作状态。session对象内部使用Map类来保存数据,因此保存数据的格式为”key/value”。session对象的value可以是复杂的对象类型,而不仅仅局限于字符串类型。session 中的常用方法:
方法 |
返回值 |
说明 |
getAttribute(String name) |
Object |
获得指定名字的属性 |
getAttributeNames() |
Enumeration |
获得session中所有属性对象 |
getCreationTime() |
long |
获得session对象创建时间 |
getId() |
String |
获得session对象唯一编号 |
getLastAccessedTime() |
long |
获得session对象最后一次被操作时间 |
getMaxInactiveInterval() |
int |
获得session对象有效时间 |
isNew() |
boolean |
判断session对象是否为新创建的 |
removeAttribute() |
void |
删除session对象中指定名称的属性 |
invalidate() |
void |
销毁session对象 |
setMaxInactiveInterval(int interval) |
void |
设置session对象的最大有效时间 |
setAttribute(String key,Object obj) |
void |
将obj以key名称保存在session中 |
创建及获取session信息:
session 是与请求有关的会话对象,是java.servlet.http.HttpSession对象,用于保存和存储页面的请求信息。session 对象的setAttribute()方法可以实现将信息保存在session范围内,而通过getAttribute()方法可以获取保存在session范围内的信息。
例如:
1)在index.jsp页面,实现将文字信息保存在session范围内:
<body>
<%
String sessionMessage="session练习";
session.setAttribute("message",sessionMessage);
out.print("保存在session范围内的对象为:"+sessionMessage);
%>
结果:
保存在session范围内的对象为:session练习
2)在default.jsp页面中:
<body>
<%
String message=(String)session.getAttribute("message");
out.print("保存在session内的值为:"+message);
%>
</body>
结果:
保存在session范围内的对象为:session练习
application对象
application对象可以将信息保存在服务器中,知道服务器关闭,否则application对象中保存的信息会在整个应用中都有效。与session相比,application对象的生命周期更长,类似于系统的“全局变量”。application对象常用方法如下表:
方法 |
返回值 |
说明 |
getAttribute(String name) |
Object |
通过关键字返回保存在application对象中的信息 |
getAtrributeNames() |
Enumeration |
获取所有application对象使用的属性名 |
setAttribute(String key,Object obj) |
void |
通过指定的名称将一个对象保存在application对象中 |
getMajorVersion() |
int |
获取服务器支持的Servlet版本号 |
getServerInfo() |
String |
返回JSP引擎的相关信息 |
removeAttribute() |
void |
删除application对象中指定名称的属性 |
getRealPath() |
String |
返回虚拟路径的真实路径 |
getInitParameter(String name) |
String |
获取指定name的application对象属性的初始值 |
访问应用程序初始化参数
application提供了对应用程序环境属性访问的方法。例如,通过初始化信息为程序提供连接数据库的URL、用户名、密码,每个Servlet程序客户和JSP页面都可以使用它获取连接数据库的信息。为了实现该目的,Tomcat使用了web.xml文件。
实例:
application实现网页计数器
由于application保存的信息在整个应用中都有效,因此可以将当前访问网站的数量保存在application对象中,在每次访问网页时,实现将保存在application对象中的值加1,从而实现网页计数器。
1)在index.jsp页面中,实现将信息保存在application对象中。具体代码如下:
<body>
<h4>application对象实现网页计数器</h4>
<%
out.print("设置数值");
Integer intcount;
if(application.getAttribute("count")==null){ //如果保存在application对象内的内容为空
intcount=1;
}
else{
intcount=(Integer.parseInt(application.getAttribute("count").toString())); //获取保存在application对象里的内容
}
application.setAttribute("name", "xiaohe"); //将信息保存在application对象内
application.setAttribute("count", intcount);
out.print("set name=xiaohe");
out.print("<br> set counter="+intcount+"<br>");
%>
<a href="j.jsp">计数器页面</a>
</body>
运行结果如下:
2)在j.jsp页面中,实现计数器统计。代码如下:
<body>
<br>获取用户名:<%=application.getAttribute("name") %>
<br>计数器:
<%
int mycount=Integer.valueOf(application.getAttribute("count").toString()).intValue();
out.println(mycount);
application.setAttribute("count", Integer.toString(mycount+1));
%>
</body>
j.jsp页面运行结果如下:
out 对象
out对象用于在Web浏览器内输出信息,并且管理应用服务器上的输出缓冲区。在使用out对象输出数据时,可以对数据缓冲区进行操作,及时清楚缓冲区中的残余数据,为其他的输出让出缓冲空间。待数据输出完毕后,要及时关闭输出流。
管理响应缓冲
在使用out输出数据时,需要使用clear()方法清除缓冲区内容,以便重新开始操作。此外,也可以通过clearBuffer()方法清除缓冲区中的内容。两者的区别是:clear()方法,如果相应内容已提交,则会报出IOException异常;clearBuffer()方法,即使内容已经提交给客户端也能够访问该方法。out对象管理缓冲区的方法如下表:
方法 |
返回值 |
说明 |
clear() |
void |
清除缓冲区中尚存的内容 |
clearBuffer() |
void |
清除当前缓冲区中尚存的内容 |
flush() |
void |
刷新流 |
isAutoFlush() |
boolean |
检查当前缓冲区是自动清空,还是满了就抛出异常 |
getBufferSize() |
int |
获取缓冲区的大小 |
向客户端输出数据
out对象的另一个重要功能是向客户端写入数据。out对象提供了两个向页面中输出信息的方法:
print():在页面中打印字符串信息,不换行
println():在页面中打印字符串信息且换行
例如:
<%out.print(“输出数据,不换行”)%>
其他内置对象
获取会话范围的pageContext对象
pageContext对象的作用是取得任何范围的参数,通过它可以获取JSP页面的out、request、response、session、application等对象。pageContext对象的创建和初始化都是由容器来完成的,在JSP页面中可以直接使用pageContext对象。pageContext对象的常用方法如下表:
方法 |
返回值 |
说明 |
forward(String path) |
void |
将JSP页面重新定向至另一个页面 |
getAttribute(String name) |
Object |
获取参数值 |
getAttributeNamesInScope(int scope) |
Enumeration |
获取某范围的参数名称集合 |
getRequest() |
ServletRequest |
获取request对象 |
getResponse() |
ServletResponse |
获取response对象 |
getOut |
JspWriter |
获取out对象 |
getSession() |
HttpSession |
获取session对象 |
getPage() |
Object |
获取page对象 |
setAttribute(String name,Object value) |
void |
设置指定参数属性 |
读取web.xml配置信息的config对象
config对象的主要作用是取得服务器的配置信息。通过pageContext对象的getServletConfig()方法可以获取一个config对象。config对象常用方法如下表:
方法 |
返回值 |
说明 |
getInitParameter(String name) |
String |
获取服务器指定参数的初始值 |
getInitParameterNames() |
Enumeraction |
获取服务器所有初始参数名称 |
getServletContext() |
ServletContext |
获取Servlet上下文 |
getServletName() |
String |
获取Servlet服务器名 |
应答或请求的page对象
page对象代表JSP本身,只有在JSP页面内才是合法的。page隐含对象本质上包含当前Servlet接口引用的变量,类似于Java编程中的this指针。page对象常用方法如下表;
方法 |
返回值 |
说明 |
getClass() |
Object |
返回当前Object的类 |
hashCode() |
Object |
返回此Object的哈希代码 |
toString() |
String |
将此Object类转换成字符串对象 |
equals(Object obj) |
boolean |
比较此对象与指定的对象是否相等 |
获取异常信息的exception对象
exception对象的作用是显示异常信息,只有在包含isErrorPage=”true”的页面中才可以使用,在一般的JSP页面中使用该对象将无法编译JSP文件。exception对象和Java的所有对象一样,都具有系统的继承结构。Exception对象几乎定义了所有的异常情况。在Java程序中,可以使用try/catch关键字来处理异常情况;如果在JSP页面中出现没有捕捉到的异常,就会生成exception对象,并把exception对象传送到在page指令中设定的错误页面中,然后在错误页面中处理相应的exception对象。Exception对象的常用方法:
方法 |
说明 |
getMessage() |
返回exception对象的异常信息字符串 |
getLocalizedmessage() |
返回本地化的异常错误 |
toString() |
返回关于异常错误的简单信息描述 |
fillInStackTrace() |
重写异常错误的栈执行轨迹 |
Servlet技术
Servlet基础
Servlet技术功能:Servlet是位于Web服务器内部的服务器端的Java应用程序,它对Java Web的应用进行了扩展,可以对HTTP请求进行处理及响应,功能十分强大。
- Servlet与普通Java应用程序不同,它可以处理HTTP请求以获取HTTP头信息,通过HttpServletRequest接口与HttpServletResponse接口对请求进行处理及回应。
- Servlet可以在处理业务逻辑之后,将动态的内容通过返回并输出到HTML页面中,与用户请求进行交互。
- Servlet提供了强大的过滤器功能,可针对请求类型进行过滤设置,为Web开发提供灵活性与扩展性。
- Servlet可与其他服务器资源进行通信。
Servlet与JSP的区别
Servlet是一种运行在服务器端的Java应用程序,先于JSP的产生。在Servlet的早期版本中,业务逻辑代码与网页代码写在一起,给Web程序的开发带来很多不便。针对早期版本Servlet的不足,Sun提出了JSP技术。
JSP是一种在Servlet规范之上的动态网页技术,通过JSP页面中嵌入的Java代码,可以产生动态网页。也可以将其理解为Servlet技术的扩展,在JSP文件第一次被请求时,它会被编译成Servlet文件,在通过容器调用Servlet进行处理。两者区别如下:
- Servlet承担客户请求与业务处理的中间角色,需要调用固定的方法,将动态内容混合到静态之中产生HTML;而在JSP页面中,可直接使用HTML标签进行输出,要比Servlet更具显示层的意义。
- Servlet中需要调用Servlet API接口处理HTTP请求,而在JSP页面中,则直接提供了内置对象进行处理。
- Servlet的使用需要进行一定的配置,而JSP文件通过”.jsp”扩展名部署在容器之中,容器对其自动识别,直接编译成Servlet进行处理。
Servlet API编程常用的接口和类
在Servlet编程中,Servlet API提供了标准的接口与类,这些对象对Servlet的操作非常重要,他们为HTTP请求与程序回应提供了丰富的方法。
- Servlet接口
在Servlet开发中,任何一个servlet对象都要直接或间接的实现javax.servlet.Servlet接口。此接口包含5 个方法,其功能及作用如下:
方法 |
说明 |
public void init(ServletConfig config) |
Servlet 实例化后,Servlet容器调用此方法来完成初始化工作 |
public void service(ServletRequest request,ServletResponse response) |
此方法用于处理客户端的请求 |
public void destroy() |
当Servlet对象应该从servlet容器中移除时,容器调用此方法,以便释放资源。 |
public ServletConfig getServletConfig() |
此方法用于获取Servlet的配置信息,返回ServletConfig对象 |
public String getServletInfo() |
此方法返回有关Servlet的信息,它是纯文本格式的字符串,如作者、版本等 |
- ServletConfig接口
ServletConfig接口位于javax.servlet包中,它封装了Servlet的配置信息,在Servlet初始化期间被传递。每一个Servlet都有且只有一个ServletConfig对象。
- HttpServletRequest接口
HttpServletRequest接口位于javax.servlet.http包中,继承了javax.servlet..ServletRequest接口,是Servlet中的重要对象,在开发过程中较为常用,其常用方法如下:
方法 |
说明 |
public String getContextPath() |
返回请求的上下文路径,此路径以“/”开头 |
public Cookie[] getCookies() |
返回请求中发送的所有cookie对象,返回值为cookie数组 |
public String getMethod() |
返回请求所使用的HTTP类型,如get,post等 |
public String getQueryString() |
返回请求中参数的字符串形式,如请求MyServlet?username=mr,则返回username=mr |
public String getRequestURI() |
返回主机名到请求参数之间部分的字符串形式 |
Public StringBuffer getRequestURL() |
返回请求的URL,此URL中不包含请求的参数 |
Public String getServletPath() |
返回请求URI中的Servlet路径的字符串,不包含请求中的参数信息 |
Public HttpSession getSession() |
返回与请求关联的HttpSession对象 |
例子:HttpServletRequest接口的使用:
创建名为MyServlet的类(它是一个Servlet),代码如下:
public class MyServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html");
response.setCharacterEncoding("UTF-8");
PrintWriter out=response.getWriter();
out.print("<p>上下文路径:"+request.getServletPath()+"</p>");
out.print("<p>HTTP请求类型:"+request.getMethod()+"</p>");
out.print("<p>请求参数:"+request.getQueryString()+"</p>");
out.print("<p>请求URI:"+request.getRequestURI()+"</p>");
out.print("<p>请求URL:"+request.getRequestURL()+"</p>");
out.print("<p>请求Servlet路径:"+request.getServletPath()+"</p>");
out.flush();
out.close();
}
}
在浏览器地址栏中输入http://localhost:8080/servlet/MyServlet?action=test,运行结果如下:
4.HttpServletResponse接口
HttpServletResponse接口位于javax.servlet.http包中,继承了javax.servlet..ServletRequest接口,也是Servlet中的重要对象,常用方法如下:
方法 |
说明 |
public void addCookie(Cookie cookie) |
向客户端写入cookie信息 |
public void sendError(int sc) |
发送一个错误状态码为sc的错误响应到客户端 |
public void sendError(ine sc,String msg) |
发送一个包含错误状态码及错误信息的响应到客户端 |
public void sendRedirect(String location) |
使用客户端重定向到新的URL,参数location为新地址 |
例子:使用HttpServletResponse对象的sendError方法向客户端发送错误信息
创建一个名称为HeServlet的Servlet对象,在doGet()方法中模拟一个开发过程的异常,并将其通过throw关键字抛出,关键代码如下:
public class HeServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
try { //创建异常
throw new Exception("数据库连接失败");
} catch (Exception e) {
response.sendError(500,e.getMessage());
}
}
}
运行结果如下图所示:
5.GenericServlet类
6.HttpServlet类
Servlet过滤器
Servlet过滤器是客户端与目标资源间的中间层组件,用于拦截客户端的请求与相应信息。
过滤器的配置:
创建一个过滤器,通过web.xml文件进行配置后才可使用。
- 声明过滤器对象:在web.xml文件中,<filter-name>指定过滤器的名称,可自定义。<filter-class>指定过滤器对象的完整位置,包含包名和类名,<init-param>设置过滤器的初始化参数。
<filter>
<filter-name>CharacterEncodingFilter</filter-name> <filter-class>com.he.CharacterEncodingFilter</filter-class> <init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
- 映射过滤器:这里需要配置过滤器的名称、过滤器关联的URL样式、过滤器对应得请求方式等。
<filter-mapping>
<filter-name>CharacterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
<dispatcher>REQUEST</dispatcher>
<dispatcher>FORWARD</dispatcher>
</filter-mapping>
说明:< dispatcher >的可选值及说明:
可选值 |
说明 |
REQUEST |
当客户端直接请求时,通过过滤器进行处理 |
INCLUDE |
当客户端通过RequestDispatcher对象的include()方法请求时,通过过滤器进行处理 |
FORWARD |
当客户端通过RequestDispatcher对象的forward()方法请求时,通过过滤器进行处理 |
ERROR |
当声明式异常产生时,通过过滤器进行处理 |