




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第字符编码的处理和BeanUtils组件使用详解目录1、字符编码问题解决方案1.1、字符编码处理的实现2、字符和谐的问题在过滤器中设置脏数据在处理完字符编码问题的时候进行和谐(在处理完编码之后进行调用)3、BeanUtils组件的使用Beanutils组件是啥BeanUtils组件能干啥BeanUtils组件的使用使用BeanUtils组件的API4、Servlet请求参数的自动封装5、源数据使用5.1、数据库的元数据的使用5.2、请求参数的元数据5.3、结果集元数据5.4、封装一个通用的JDBC的增删改的方法5.5、封装一个根据条件查询返回集合的方法
1、字符编码问题解决方案
原理:过滤器技术拦截所有的controll的请求、在controll请求中使用了动态代理的设计模式监听了HttpServletRequest这个接口中getParameter方法的执行、在getParameter执行的时候、我们首先去获取这个数据、再通过判断当前的请求是GET还是POST、如果是GET那么先使用IOS-8859-1进行转码然后使用UTF-8从新进行编码、如果是POST那么直接使用request.setCharacterEncoding(UTF-8)来进行处理
1.1、字符编码处理的实现
publicclassCharacterFilterimplementsFilter{
@Override
publicvoidinit(FilterConfigarg0)throwsServletException{
*拦截的这个方法
@Override
publicvoiddoFilter(ServletRequestrequest,ServletResponseresponse,
finalFilterChainchain)throwsIOException,ServletException{
finalHttpServletRequestreq=(HttpServletRequest)request;
finalHttpServletResponseresp=(HttpServletResponse)response;
//第一步:将返回数据的编码问题给处理了
resp.setContentType("text/html;charset=utf-8");
//POST的解决方案
req.setCharacterEncoding("UTF-8");
//第二步:监听httpServletRequest中getParameter方法的执行
HttpServletRequestreq1=(HttpServletRequest)Proxy.newProxyInstance(HttpServletRequest.class.getClassLoader(),
newClass[]{HttpServletRequest.class},
newInvocationHandler(){
@Override
publicObjectinvoke(Objectproxy,Methodmethod,Object[]args)
throwsThrowable{
//监听当前执行的方法是不是getParameter
StringmethodName=method.getName();
if("getParameter".equals(methodName)){//说明执行的是getParameter
//判断当前执行的是POST呢?还是GET呢
StringreqName=req.getMethod();
//通过key获取这个值
Stringval=(String)method.invoke(req,args);
if("GET".equalsIgnoreCase(reqName)){//说明是GET方法
//执行这个方法获取这个值
val=newString(val.getBytes("ISO-8859-1"),"UTF-8");
}elseif("POST".equalsIgnoreCase(reqName)){//说明是POST方法
//返回这个方法执行的结果
returnval;
}else{
returnmethod.invoke(req,args);
//最终要进行放行
chain.doFilter(req1,resp);
@Override
publicvoiddestroy(){
2、字符和谐的问题
明白一个问题:什么是字符和谐:类似于博客网站上行比如你骂人了一句话这句话并不会直接显示出来、而是显示成****等这种现象就称为字符的和谐
要实现字符和谐首先要解决编码问题(上面已经解决了)
在过滤器中设置脏数据
//需要和谐的脏数据
privateString[]dirtyData={"MMD","NND","杀人","CTM"};
在处理完字符编码问题的时候进行和谐(在处理完编码之后进行调用)
protectedStringhandleDirtyData(Stringval){
for(inti=0;idirtyData.length;i++){
if(val.contains(dirtyData[i])){
val=val.replaceAll(dirtyData[i],"***");
returnval;
3、BeanUtils组件的使用
Beanutils组件是啥
Beanutils不是一个框架、就相当于是一个帮助类、这个帮助类的作用就是专门用来操作我们javaBean
BeanUtils组件能干啥
能够将一个实体的值赋值给另外一个实体、也可以将map类型的值赋值给实体、也可以将实体进行拷贝
BeanUtils组件的使用
导入beanUtils的包
使用BeanUtils组件的API
publicvoidtestbeanUtils()throwsException{
Useruser=newUser(1,"小波波","123");
//使用BeanUtils来操作这个是实体
//API:表示的是给那个对象的那个属性设置什么值
//BeanUtils.setProperty(user,"uName","小波波");
//BeanUtils.copyProperty(user,"uPwd","123");
//API:拷贝一个实体返回值就是copy生成的新的实体
//Useruser2=(User)BeanUtils.cloneBean(user);
Useruser2=newUser();
//把一个实体里面的属性copy给另外一个实体的属性
//BeanUtils.copyProperties(user2,user);
//将实体转换成map
//MapObject,Objectmaps=BeanUtils.describe(user);
//获取实体的属性值并转换成String类型的数组
//String[]strVal=BeanUtils.getArrayProperty(user,"uName");
//将Map中的数据直接赋值给JAVA的对象
MapString,Objectmaps=newHashMapString,Object
maps.put("uId",123);
maps.put("uName","小波波");
maps.put("uPwd","110");
//将map中的数据直接赋值给JAVA对象
BeanUtils.populate(user2,maps);
System.out.println(user2);
4、Servlet请求参数的自动封装
publicstaticTTgetObject(HttpServletRequestrequest,Classclazz)throwsException{
//反射得到这个数据类型
Tt=(T)clazz.newInstance();
//使用beanUtils组件来设置这个值
BeanUtils.populate(t,request.getParameterMap());
returnt;
5、源数据使用
源数据分类:数据库的源数据、请求参数的元数据、结果集的元数据
数据库的元数据:能够获取当前访问数据库的一些信息(数据库的名字、连接的URL、连接的用户名、数据库的版本信息)
请求参数的元数据:能够精确的知道当前的SQL语句中有多少个占位符
结果集元数据:就能清楚的知道当前访问的这个数据库的列名是什么
5.1、数据库的元数据的使用
publicvoidtestDatabaseMetaData()throwsException{
//第一步:加载驱动
Class.forName("com.mysql.jdbc.Driver");
//第二步:创建连接
Connectionconn=DriverManager.getConnection(URL,USER,PASSWORD);
//获取数据库的元数据
DatabaseMetaDatadata=conn.getMetaData();
//获取数据库的相关信息
System.out.println("数据库的名字:"+data.getDatabaseProductName());
System.out.println("数据库的版本:"+data.getDatabaseProductVersion());
System.out.println("数据库的URL:"+data.getURL());
System.out.println("访问的用户名:"+data.getUserName());
System.out.println("---------------------------------------");
//第三步:创建操作数据库的对象
PreparedStatementstate=conn.prepareStatement("select*frommsgstateinfo");
//第四步:操作
ResultSetset=state.executeQuery();
//遍历....
while(set.next()){
Stringstr=set.getString("msgstate");
System.out.println("获取到的数据是:"+str);
conn.close();
5.2、请求参数的元数据
nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;publicvoidtestRequestParameMetaData()throwsException{
//第一步:加载驱动
Class.forName("com.mysql.jdbc.Driver");
//第二步:创建连接
Connectionconn=DriverManager.getConnection(URL,USER,PASSWORD);
System.out.println("---------------------------------------");
//第三步:创建操作数据库的对象
PreparedStatementstate=conn.prepareStatement("select*frommsgstateinfowhereidandmsgobj=andaa=");
//第四步:玩下请求参数的元数据
ParameterMetaDatadata=state.getParameterMetaData();
//现在你就可以知道当前的SQL语句中有多少个占位符了
System.out.println("占位符的个数:"+data.getParameterCount());
conn.close();
5.3、结果集元数据
publicvoidtestResultSetMetaData()throwsException{
//第一步:加载驱动
Class.forName("com.mysql.jdbc.Driver");
//第二步:创建连接
Connectionconn=DriverManager.getConnection(URL,USER,PASSWORD);
System.out.println("---------------------------------------");
//第三步:创建操作数据库的对象
PreparedStatementstate=conn.prepareStatement("select*fromt_user");
ResultSetset=state.executeQuery();
//下面就可以获取结果集的元数据了
ResultSetMetaDataresultSetMetaData=set.getMetaData();
while(set.next()){//相当于是遍历的是行
//我们还可以遍历列
intcolumnNum=resultSetMetaData.getColumnCount();
//通过列的下标来知道列的名字
for(inti=0;icolumnNum;i++){
//通过列的下标来找到列的名字
StringcolumnName=resultSetMetaData.getColumnName(i+1);
//知道了列的名字也就能找到这个列的值了
Objectval=set.getObject(columnName);
System.out.println(val);
conn.close();
5.4、封装一个通用的JDBC的增删改的方法
publicvoidupdate(Stringsql,Object...parames)throwsException{
//获取连接
Connectionconn=getConnection();
//第二步:获取操作数据库的对象
PreparedStatementstate=conn.prepareStatement(sql);
//第三步:将传递过来的参数直接赋值给占位符
//获取占位符的个数
ParameterMetaDataparameterMetaData=state.getParameterMetaData();
//获取占位符的个数
intnum=parameterMetaData.getParameterCount();
if(parames.lengthnum){
thrownewRuntimeException("参数不对应没法玩....");
//说明参数是对的
for(inti=0;inum;i++){
//设置参数了
state.setObject(i+1,parames[i]);
//执行这个SQL语句
state.executeUpdate();
close();
5.5、封装一个根据条件查询返回集合的方法
publicTListTfindAll(Stringsql,ClassTclazz,Object...parames)throwsException{
//确定返回的这个容器
ListTlists=newArrayListT
//获取连接
Connectionconn=getConnection();
//第二步:获取操作数据库的对象
PreparedStatementstate=conn.prepareStatement(sql);
//第三步:将传递过来的参数直接赋值给占位符
//获取占位符的个数
ParameterMetaDataparameterMetaData=state.getParameterMetaData();
//获取占位符的个数
intnum=parameterMetaData.getParameterCount()
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论