Web容器的错误处理
统一设置编码:Filter
访问权限验证
用户头像上传:Commons FileUpload
用户名是否重复:Ajax基本原理、响应文本的处理
管理员查询:响应XML的处理,动态显示数据
用户登录IP统计:用户IP的统计
1.Web容器处理以下的错误
HTTP错误
生成缺省的错误页面
Servlet抛出的异常
生成缺省的错误页面,HTTP状态代码设置为500
1.1在DD文件中配置HTTP错误处理
例:
<error-page>
<error-code>404</error-code>
<I ocat ion>/error404. jsp</ locat i on>
</error-page>
如果发生(error-code)指定的HTTP错误,Web容
器将请求转发给(locat ion)指定的Web资源。
1.2在DD文件中配置异常处理
示例
<error-page>
<except ion-type>
java. lang. Except ion
</except ion-type>
<locat ion>/error500. jsp</ locat ion>
</error-page>
Web容器捕获Servlet中抛出的异常,如果异常类型与(except ion-type)指定的相匹配:
-容器将异常对象及请求的URI保存在请 求对象中,key值:
”javax. servlet. error. except ion”
"javax. servlet. error. request_ _ur i“
-容器将请求转发给(locat ion)指定的Web资源
1.3JSP中的错误:
翻译时(解析错误)
编译时(代码错误)
运行时(异常或逻辑错误)
JSP中异常的处理:
-JSP页面代码可以抛出任意异常对象,抛出的异常在_jspService方法中被处理。 抛出_ jspService方法中的异常由Web容器处理。
-可以为当前页面指定一个异常处理页面,处理当前页面抛出的异常
为当前页面指定异常处理页面
- /throws_ error. jsp的page指令
<%@ page errorPage='
”error/Except ionPage. jsp”%>
-/error/Except ionPage. jsp的page指令
<%@ page isErrorPage=” true”%>
page指令的errorPage属性
指定处理此JSP页面的异常处理页面-
语法: errorPage =“相对URL“
相对URL以“/”起始,表示相对于context root的URL;否则,相对于当前JSP页面的URL
page指令的isErrorPage属性
-声明此JSP页面是否是騏它JSP页面的异常处理页面
-属性值是true或者false (缺省值)
-如果为true,可以引用异常对象except ion
2.统一设置编码
2.2处理HTTP请求数据的编码
在JSP页面,设置编码方式
<%@ page language="java" pageEncoding="tf-8"%>
在HTML页面,设置编码方式
<meta http-equiv="content-type" content="texthtml; charset=UTF-8">
在servlet中设置请求报文的编码方式
public class TestServlet extends HttpServlet{
public void doGet(HttpServletRequest request, HttpServletResponse response)
{
//设置htp请求的编码方式
request. setCharacterEncoding(“UTF-8”);
…
}
处理数据库数据编码
如果要处理数据库的乱码,需要使用Java代码对数据库的数据进行编码转换,可以使用String类的getBytes()方法进行转换
一般不需要
过滤波简介:
过滤器能够对Servlet容器的请求和响应对象进行检查和修改。
过滤器的作用:
-过滤器在Servlet被调用之前检查Request对象,修改Request Header 和Request内容
-过滤器在Servlet被调用之后检查Response对象,修改Response Header 和Response内容。
过滤的内容:
-Servlet、 JSP、HTML等文件
创建过滤器:
-所有的过滤器类都必须实现javax. servlet. Filter接口。这个接口还有3个必须实现的方法:
-初始化方法:
public void init (FilterConfig config)
-过滤方法.
public void doFilter(ServletRequest req,ServletResponse resp,FilterChain chain)
-销毁过滤器方法
public void destroy( )
<filter>
<filter-name>
SetCharacterEncodinglilter</filter-name>
<ilter-class>com.neuedu.utils. SetCharacterEncodingilter</ilter-
class>
<filter>
<ilter-mapping>
<filter-name> SetCharacterEncodingFilter</fiter-name>
<url-pattern>/*
3.访问权限认证
获取请求路径
通过过滤器对请求路径检查
if (urt.indexOf("Admin/")!=-1
&& (user == null II !"1". equals(user. getRulel0)))
II url.indexOf("User/")!=-1
&& (user == null II !"2".equals(user.getRule)))) {
req.getSession(.removeAttribute("user");
req.getSession0.invalidate();
resp.sendRedirect(req.getContextPath() + "/Login.jsp");
return;
}
4.用户头像上传
Commons Fi leUpload
-FileUpload 是Apache commons下面的一个子项目,用来实现Java环境下的文件.上传功能,与常见的SmartUp load齐名
-组件Fi leUp | oad依赖于Commons 10组件
commons- -fileupload-1.3. 1-bin. zip
commons- io 2. 4-bin. zip
4.1客户端
-form的enctype属性设置为multipart/form-data,设置该值后,浏览器在上传文件时,将把文件数据附带在Http请求体中,并使用MIME协议对上传文件进行描述,以方便接收仿对上传数据进行解析和处理。
-form的method属性设置为POST
-添加文件.上传项
4.2服务端
服务端
DiskFi leltemFactory:
DiskFileltemFactory是创建Fileltem 对象的工厂,这个工厂类常用方法:
●public void setS izeThreshold(int sizeThreshold)
:设置内存缓冲区的大小,默认值为10K。当上传文件大于缓冲区大小时,fi leupload组件将使用临时文件缓存.上传文件。
●public void setRepository(java. io.File repository) :
指定临时文件目录,默认值为
System. getProperty(" java. io. tmpdir").
●public Di skFileltemFactory(int sizeThreshold,
java. io.File repository) :构造方法
ServletFileUp load
-ServletFileUp load 负责处理上传的文件数据,并将表单中每个输入项封装成- -个Fileltem 对象,常用方法有:
●boolean isMult ipar tContent (HttpServ | etRequest
request) :判断上传表单是否为multipart/ form-data类型
●List par seRequest (HttpServ letRequest request): 解析request对象,并把表单中的每一个输入项包装成一个fileltem对象,并返回一个保存了所有Fileltem的list集合
●setFileSizeMax(long fileSizeMax) :设置上传文件的最大值
●setSizeMax(long sizeMax) :设置上传文件总量的最大值
●setHeaderEncoding(java. lang. Str ing encoding) :设置编码格式
Fileltem
-File ltem代表每- -个.上传的文件,其常用方法有:
●1. boolean isFormField): isFormF ield方法用于判断Fileltem类对象封装的数据是- -个普通文本表单字段,还是一个文件表单字段
●2. String getName() : getName方法用于获得文件上传字段
中的文件名
●3. String getFieldName(): getFieldName方法用于返回表单标签name属性的值
●4. void write(File file): write方法用于将Fileltem对象中保存的主体内容保存到某个指定的文件中
●5. void delete() : delete方法将删除该临时文件
完成头像上传和显示
String fileName = item.getName();
if (fileName != null && fileName.index:((")!= -1){
String name = new Date(.getTime() + "" +
fileName .substring(ileName.indexO(f(".")+ 1);
File fullFile = new
File(getServletContext(). getRealPathc*/images/photo/"), name);
one. setlmagePath(name);
item.write(ullFile);
}
item.delete();
5.用户名是否重复
Ajax基本原理
响应文本的处理
5.1Ajax功能
Ajax的功能:
使用DOM实现动态显示和交互
使用XHTML和CSS标准化呈现
使用XML和XSLT进行数据交换与处理
使用XMLHttpRequest进行异步数据读取
最后用JavaScr ipt绑定和处理所有数据
5.2Ajax的基本原理:
readyState属性表明请求的状态。
-0:请求没有发出(在调用opeen() 之前)
-1:请求已经建立但还没有发出(调用send() 之前)
-2:请求已经发出正在处理之中(这里通常可以从响应得到内容头部)
-3:请求已经处理,响应中通常有部分数据可用,但是服务器还没有完成响应
-4:响应已完成,可以访问服务器响应并使用它
Ajax发送请求:
var req = false;
function processRequest(){
if (window.XMLHttpRequest) {
req = new XMLHtpRequest();
}else if (window.ActiveXObject) {
req = new ActiveXObject( "Microsoft XMLHTTP");
}
if(req){
var url = "register?action=check",;
//POST方式
req.open("post", url, false);
req.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
req.onreadystatechange = updatePage;
var username = document.getElementByld("usermname").value;
req.send("username=" + userame);
}
Ajax处理请求:
function updatePageO
if(req.readyState==4)
if(req. satus==200j{onseText
var res = req.respo
if(res== 1){
document.getElementByld'res"),neHTML=可以使用”,
} else {
document.getElementByld("res").innerHtML="已经被占用"
document.geElemetByld("username").focus();
}
}
}
}
6.管理员查询
响应XML的处理
动态显示数据
6.1服务器端生成XML
XML:可扩展标记语言(eXtensible Markup
Language )
-XML是一种类似于HTML的标记语言
-XML是一种平台无关的表示数据的方法
-XML的用途:
●XML把数据从HTML分离
●XML简化数据共享
●XML简化数据传输
●XML简化平台的变更
●XML用于创建新的Internet 语言
6.2浏览XML
浏览XML
XML特点
<? xml version=“1.0" encoding=' *gb2312" standalone="yes" ?>
XML文档声明属性:
-encoding属性 (可选的)
●注明XML文档使用的字符编码方式
●Unicode (缺省)一UTF-8或UTF-16
-standalone属性( 可选的)
●说明文档是否是独立的
●该属性取值有两种: yes或no
根元素:
没有被嵌套在其他元素内的元素,最高层元素,仅一个
XML文档中所有元素都是跟元素的子孙元素
空元素:不包含任何内容的元素
标记命名规则:
在XML中,可以使用自己需要的元素来扩展标记语言
基本规则:
●标记名称不能以数字或特殊字符开头
●可以包含字母,数字,下划线等.
●不能以字符串“XML”作为开头
●不能包含空格
●尽量不要包含特殊字符
●区分大小写
标记的命名规范
元素属性:
<tel preferred="true">
513-744-889
</tel>
<gangster name='George "Shotgun" Ziegler'>
<gangster name="George 'Shotgun' Ziegler">
XML注意事项:
DOM (Document 0b ject Mode |文档对象模型)
SAX
JavaScript解析XML
var xmlDoC = req.responseXML .documentElement;
var user =xmlDoc.getElementsByTagName("user");
for (vari= 0;i< user.length; i++) {
var id = user[i].childNodes[0].firstChild.nodeValue;
var realname = user[i].childNodes[].firstChild .nodeValue;
var sex = user[] .childNodes[2].firstChild.nodeValue;
var certType = user[j.childNodes[31.firstChild.nodeValue;
var cert = user[j.childNodes[4].firstChild.nodeValue;
var userType = user[] .childNodes[5].firstChild.nodeValue;
}
7.用户访问IP地址统计
JFreeChart
核心类
配置web.xml
<servlet>
<servlet-name>DisplayChart</servlet-name>
<servlet-class>org.jfree. .chart. servlet. DisplayChart</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>DisplayChart</servlet-name>
<url-pattern>/Admin/DisplayChart</url-pattem>
</servlet-mapping>
生成柱状图
<%
Font font=new Font("微软雅黑" ,Font. BOLD,18),
DefaultCategoryDataset dataset = new DefaultCategoryDataset();
List<lpAddress> list =
(ArrayL ist<IpAddress> )request. getibte(iplist');,
for (IpAddress ipAddress : list) {
dataset. addValue(ipAddress getCnt(), "Count", ipAddress getlp();
}
JFreeChart chart = ChartFactory.createBarChart3D("登录IP统计图"," ",dataset, PlotOrientation.VERTICAL, false, false, false);
chart.getTitle). setFont(font);
NumberAxis axis =
(NumberAxis)chart.getCategoryPlot().getRangeAxis(),
axis. setTickUnit(new NumberTickUnit());
String filename = Servetilties. saveChartAsPNG(chart, 420, 300, null,
session);
String graphURL = request. getContextPath() +
"/Admin/DisplayChat?ilename=" + filename;
%>
<img src="<%= graphURL %>" width="420" height="300" border="0">