面试题练习(13)——(含JAVA或JSP乱码解决方案)主要七种乱码处理、get提交与post提交的区别、doPost,doGet的区别

28 篇文章 0 订阅
15 篇文章 0 订阅

怎么获取URL栏的GET或POST请求、面试题:输入url按回车发生了什么、JDBC的参数

JAVA出现乱码原因有哪些:

1.字节和unicode码
2.强制类型转换 
3.包装类过渡类型转换
4.字符串型与其它数据类型的转换
5.将字符型直接做为数值转换为其它数据类型
6.Date类与其它数据类型的相互转换

2、强制类型转换 
将高级变量转换为低级变量时,情况会复杂一些,你可以使用强制类型转换。即你必须采用下面这种语句格式:


  int i=99;
  byte b=(byte)i;
  char c=(char)i;
  float f=(float)i;
  
可以想象,这种转换肯定可能会导致溢出或精度的下降,因此笔者并不推荐使用这种转换。

3、包装类过渡类型转换:
在我们讨论其它变量类型之间的相互转换时,我们需要了解一下Java的包装类,所谓包装类,就是可以直接将简单类型的变量表示为一个类,在执行变量类型的相互转换时,我们会大量使用这些包装类。Java共有六个包装类,分别是Boolean、Character、Integer、Long、Float和Double,从字面上我们就可以看出它们分别对应于 boolean、char、int、long、float和double。而String和Date本身就是类。所以也就不存在什么包装类的概念了。
在进行简单数据类型之间的转换(自动转换或强制转换)时,我们总是可以利用包装类进行中间过渡。
一般情况下,我们首先声明一个变量,然后生成一个对应的包装类,就可以利用包装类的各种方法进行类型转换了。例如:
例1,当希望把float型转换为double型时:


   float f1=100.00f;
   Float F1=new float(f1);
   Double d1=F1.doubleValue();//F1.doubleValue()为Float类的返回double值型的方法
  
当希望把double型转换为int型时:


   double d1=100.00;
   Double D1=new Double(d1);
   int i1=D1.intValue();
  
当希望把int型转换为double型时,自动转换:


   int i1=200;
   double d1=i1;
  
简单类型的变量转换为相应的包装类,可以利用包装类的构造函数。即:
Boolean(boolean value)、Character(char&n9 7 3 1 2 3 4 4 8 : bsp;value)、Integer(int value)、Long(long value)、Float(float value)、Double(double value)
而在各个包装类中,总有形为××Value()的方法,来得到其对应的简单类型数据。利用这种方法,也可以实现不同数值型变量间的转换,例如,对于一个双精度实型类,intValue()可以得到其对应的整型变量,而doubleValue()可以得到其对应的双精度实型变量。

4、字符串型与其它数据类型的转换 
通过查阅类库中各个类提供的成员方法可以看到,几乎从java.lang.Object类派生的所有类提供了toString()方法,即将该类转换为字符串。例如:Characrer,Integer,Float,Double,Boolean,Short等类的toString()方法toString()方法用于将字符、整数、浮点数、双精度数、逻辑数、短整型等类转换为字符串。如下所示:


  int i1=10;
  float f1=3.14f;
  double d1=3.1415926;
  Integer I1=new Integer(i1);//生成Integer类\r
  Float F1=new Float(f1); //生成Float类\r
  Double D1=new Double(d1); //生成Double类\r
  //分别调用包装类的toString()方法转换为字符串
  String si1=I1.toString();
  String sf1=F1.toString();
  String sd1=D1.toString();
  Sysytem.out.println("si1"+si1);
  Sysytem.out.println("sf1"+sf1);
  Sysytem.out.println("sd1"+sd1);

6、Date类与其它数据类型的相互转换
整型和Date类之间并不存在直接的对应关系,只是你可以使用int型为分别表示年、月、日、时、分、秒,这样就在两者之间建立了一个对应关系,在作这种转换时,你可以使用Date类构造函数的三种形式:
Date(int year, int month, int date):以int型表示年、月、日
Date(int year, int month, int date, int hrs, int min):以int型表示年、月、日、时、分
Date(int year, int&nbs9 7 3 1 2 3 4 4 8 : p;month, int date, int hrs, int min, int sec):以int型表示年、月、日、时、分、秒\r
在长整型和Date类之间有一个很有趣的对应关系,就是将一个时间表示为距离格林尼治标准时间1970年1月1日0时0分0秒的毫秒数。对于这种对应关系,Date类也有其相应的构造函数:Date(long date)
获取Date类中的年、月、日、时、分、秒以及星期你可以使用Date类的getYear()、getMonth()、getDate()、getHours()、getMinutes()、getSeconds()、getDay()方法,你也可以将其理解为将Date类转换成int。
而Date类的getTime()方法可以得到我们前面所说的一个时间对应的长整型数,与包装类一样,Date类也有一个toString()方法可以将其转换为String类。

jsp乱码如何解决:

(1).

一、JSP页面显示乱码
二、表单提交中文时出现乱码
三、数据库连接时出现乱码
一、JSP页面显示乱码
下面的显示页面(display.jsp)就出现乱码:

<html> 
<head> 
<title>JSP的中文处理</title> 
<meta http-equiv="Content-Type" content="text/html; charset=gb2312"> 
</head>
<body> 
<% 
out.print("JSP的中文处理"); 
%> 
</body> 
</html>
对不同的WEB服务器和不同的JDK版本,处理结果就不一样。原因:服务器使用的编码方式不同和浏览器对不同的字符显示结果不同而导致的。解决办法:在JSP页面中指定编码方式(gb2312),即在页面的第一行加上:

英文代码<%@ page contentType="text/html; charset=gb2312"%>
就可以消除乱码了。完整页面如下:

<%@ page contentType="text/html; charset=gb2312"%> 
<html> 
<head> 
<title>JSP的中文处理</title> 
<meta http-equiv="Content-Type" content="text/html; charset=gb2312"> 
</head>
<body> 
<% 
out.print("JSP的中文处理"); 
%> 
</body> 
</html>

二、表单提交中文时出现乱码
下面是一个提交页面(submit.jsp),代码如下:

<html> 
<head> 
<title>JSP的中文处理</title> 
<meta http-equiv="Content-Type" content="text/html; charset=gb2312"> 
</head>
<body> 
<form name="form1" method="post" action="process.jsp"> 
<div align="center"> 
<input type="text" name="name"> 
<input type="submit" name="Submit" value="Submit"> 
</div> 
</form> 
</body> 
</html>
下面是处理页面(process.jsp)代码:

<%@ page contentType="text/html; charset=gb2312"%> 
<html> 
<head> 
<title>JSP的中文处理</title> 
<meta http-equiv="Content-Type" content="text/html; charset=gb2312"> 
</head>
<body> 
<%=request.getParameter("name")%> 
</body> 
</html>
如果submit.jsp提交英文字符能正确显示,如果提交中文时就会出现乱码。原因:浏览器默认使用UTF-8编码方式来发送请求,而UTF-8和GB2312编码方式表示字符时不一样,这样就出现了不能识别字符。解决办法:通过request.seCharacterEncoding("gb2312")对请求进行统一编码,就实现了中文的正常显示。修改后的process.jsp代码如下:

<%@ page contentType="text/html; charset=gb2312"%> 
<% 
request.setCharacterEncoding("gb2312"); 
%> 
<html> 
<head> 
<title>JSP的中文处理</title> 
<meta http-equiv="Content-Type" content="text/html; charset=gb2312"> 
</head>
<body> 
<%=request.getParameter("name")%> 
</body> 
</html>

三、数据库连接出现乱码
只要涉及中文的地方全部是乱码,解决办法:在数据库的数据库URL中加上useUnicode=true&characterEncoding=GBK就OK了。

四、数据库的显示乱码
在mysql4.1.0中,varchar类型,text类型就会出现中文乱码,对于varchar类型把它设为binary属性就可以解决中文问题,对于text类型就要用一个编码转换类来处理,实现如下:

public String iso2gb(String qs) 
{ 
try{ 
if (qs == null) return "NULL"; 
else 
{ 
return new String(qs.getBytes("iso-8859-1"),"gb2312"); 
} 
} 
catch(Exception e){ 
System.err.println("iso2gb error:"+e.getMessage()); 
} 
return "NULL"; 
}
public String gb2iso(String qs) 
{ 
try 
{ 
if (qs == null) return "NULL"; 
else { 
return new String(qs.getBytes("gb2312"),"iso-8859-1"); } 
} 
catch(Exception e){ System.err.println("gb2iso error:"+e.getMessage());} 
return "NULL"; 
}

(2).【解决JSP乱码,大多要注意编码格式的转换】

①<%@ page contentType="text/html; charset=UTF-8"%>【用于jsp文件】(<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 【适用于jsp与html文件,一般新建jsp或html都会自带这个】)

②表单采用post提交:

get提交与post提交的区别?

1.get方式提交数据,字符个数不能超过255个或字节大小不超1.3K,所有的参数会在地址栏显示,安全性比较差;

2.一般form提交数据时用post方式提交数据,不会限制数据量,适合于大数据量传输,安全性高;

参考:Post与Get区别

从缓存角度说post和get的区别(摘抄)

GET和POST区别及缓存问题

doPost,doGet的区别? 

1、当你直接访问一个servlet时,调用的是doGet方法。 
2、如果你的html里面规定了method访问哪个方法,则调用该方法。 
3、get和post提交的数据量是不一样的.get好像最多只能在url后跟8K, post没这个限制
真正的区别在于,请求的形式是get or post 
<form method="post".... 
<form method="get".... 

需要针对不同的请求使用不同的方法来处理

不管是post还是get方法提交过来的连接,都会在service中处理,然后,由service来交由相应的doPost或doGet方法处理,如果你重写了service方法,就不会再处理doPost或doGet了。因为一个service()方法会调用doPost或者doGet方法,所以我们一般只需覆盖doPost或者doGet方法,不必覆盖service()方法。

③request.setCharacterEncoding("编码(utf-8/GBK/GB2312)");【适用于post方式提交至后台(主要对request请求设置编码格式)与jsp文件】 

response.setContentType("text/html;charset=UTF-8");    或  response.setCharacterEncoding("UTF-8")【适用于post方式提交至后台,主要设置response响应的编码】

注意在框架的使用中:request.setCharacterEncoding(encoding);只对post请求有效。而且,spring的CharacterEncodingFilter也只是做了request(和response).setCharacterEncoding(encoding);的操作。所以spring的filter配置不作用于get参数接收。

Response的setContentType(encoding)、setCharacterEncoding(encoding)的区别,乱码的其他解决方案,MIMA(与Http请求)

⑤text = new String( text.getBytes(“iso8859-1”),”UTF-8”);  即:强制转换编码 new String(“内容”.getBytes(“iso-8859-1” ), “UTF-8” ) 【解释:首先以“iso8859-1”解码为byte数组,再用“UTF-8”重构字符串。对应问题是:我们在web应用开发过程中经常遇到输出某种编码的字符,如iso8859-1等,如何输出一个某种编码的字符串?适用于get方式提交至后台】

⑥<constant name="struts.il8n.encoding" value="UTF-8"></constant>【在SSH框架里或者只有Struts的Web项目里的配置文件struts.xml】

⑦编码过滤器:【对所有的请求响应设置的编码为UTF-8】

web.xml:
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" 
	xmlns="http://java.sun.com/xml/ns/javaee" 
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
	http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
  <servlet>
    <description>部门表</description>
    <display-name>部门表</display-name>
    <servlet-name>DepServlet</servlet-name>
    <servlet-class>com.ht.servlet.DepServlet</servlet-class>
  </servlet>

  <servlet-mapping>
    <servlet-name>DepServlet</servlet-name>
    <url-pattern>/depServlet</url-pattern>
  </servlet-mapping>
  <filter>
  	<filter-name>EncodingFilter</filter-name>
  	<filter-class>com.ht.filter.EncodingFilter</filter-class>
  	<init-param>
  		<param-name>encoding</param-name>
  		<param-value>UTF-8</param-value>
  	</init-param>
  </filter>
  <filter-mapping>
  	<filter-name>EncodingFilter</filter-name>
  	<url-pattern>/*</url-pattern>
  </filter-mapping>
  <welcome-file-list>
    <welcome-file>login.jsp</welcome-file>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
</web-app>


EncodingFilter:
package com.ht.filter;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

public class EncodingFilter  implements Filter{
	private String encoding;
	public void destroy() {
		
	}

	public void doFilter(ServletRequest request, ServletResponse response,
			FilterChain chain) throws IOException, ServletException {
		if(encoding!=null && !encoding.equals("")){
			request.setCharacterEncoding(encoding);
		}
		chain.doFilter(request,response);
	}

	public void init(FilterConfig config) throws ServletException {
		encoding=config.getInitParameter("encoding");
		
	}
	
}

过滤器Filter配置web.xml(SSM、SSH)

三种方式解决你的js加载乱码【JS乱码问题,PHP语言的】

JS文件中的中文在网页上显示为乱码解决方法【JS文件编码与内容的设置的编码格式不一致,不是UTF-8】

get请求中url传参中文乱码问题--集锦【Or 中文乱码 encodeURI来解决URL传递时的中文问题(后台使用URLEncode与URLDecode)】

SQLSERVER2012 保存阿拉伯文字乱码的问题【在值的单引号前面加N,在论坛上了解下:sql数据库 insertt或select韩国语时变成乱码,怎么办??

PHP从数据库导出数据到excel,无插件(解决中文以及法语乱码问题)【随便看看】

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Yvette_QIU

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值