SSH项目笔记
解决中文字符乱码:
Stringtemptestname=request.getParameter("testname");
String testname = new String(temptestname.getBytes("iso-8859-1"),"utf-8");
//删除服务器端的文件;
File file=new File(jabean.getJaurl().replaceAll("\\\\", "\\\\\\\\"));
file.delete();
注:在java中处理文件都需要\\或者/
当Java存储路径到数据库时,数据库会自动将\\或者/转变成计算机的路径\,因此java从数据库取出路径后需要处理路径。
1)表单发送请求时(button的type必须是submit!!!),后台action中获取表单中的参数可以通过模型驱动,也可以:
HttpServletRequest request=ServletActionContext.getRequest();
fileclass=request.getParameter("radio");
2)当表单仅为了获取用户输入的参数,不用来提交表单时,button的type必须是button!!!不能是submit,否则不会执行ajax请求的action。
3)当ajax的参数不在模型驱动中时,可以随便借用一个模型驱动中的参数来传值到后台action中!
boolean result=Str.contains(“abc”);是找指定字符串是否包含一个字串,返回值的boolean类型,即只有true和false
int result=str.indexOf(“abc”);有多个重载,但无论哪个,都是做一定的匹配,然后把匹配的第一个字符的位置返回,返回的是int类型,如果没找到,那么返回-1.
vartgh="<%=session.getAttribute("tgh") %>";
vartid="<%=session.getAttribute("tid")%>";
若$(function(){………});中给元素绑定了事件,当遇见事件中还要激发事件时,就得使用<aοnclick=”func()” >点击链接</a>。否则出错!
如:$(function(){
$("#jiaoan").click(function(){
//显示之前清空内容面板;
$("#pcontent").empty();
//查询并显示所有已上传的教案;1、获得所授课程名以供选择 2、根据选择的课程名查询已上传的教案;
var tgh="<%=session.getAttribute("tgh") %>";
vartid= "<%=session.getAttribute("tid") %>";
$.ajax({
type:"post",
url:"myteacheraction_getTeachCourse.action",
data:"tgh="+tgh+"&tid="+tid+"&tname="+tid+"&tsex="+tid+"&ttitle="+tid+"&tsection="+tid+"&tted="+tid,
dataType:"json",
error:function(){
alert("查询所授课程失败!");
},
success:function(data){
varobj = eval("("+data+")");
$("#pcontent").html("<table><tr><td>请选择查询的课程名:</td></tr></table>");
$.each(obj,function(i,item){
$("#pcontent").append("<tr><td><a href='#'class='selectcname'οnclick='selectcname(this)'>"+item.cname+"</a></td></tr>");
});
}
});
});
});
//教师点击查询的课程名执行对应的点击事件;
functionselectcname(obj){
varcname=$(obj).html();
alert(cname);
}
var obj =eval("("+data+")");
Action中:返回jsonobject的字符串:
publicString getTeacherInfo(){
ArrayList<TTBean> list=service.getTeacherInfo(ttbean);
JSONObject jsonobj=JSONObject.fromObject(list.get(0));
result=jsonobj.toString();
returnSUCCESS;
}
Jsp中:ajax获取jsonobject中的数据,并动态生成表格;
$(function(){
$("#teacherinfo").click(function(){
var tgh= "<%=session.getAttribute("tgh") %>";
var tid= "<%=session.getAttribute("tid") %>";
$.ajax({
type:"post",
url:"myteacheraction_getTeacherInfo.action",
data:"tgh="+tgh+"&tid="+tid+"&tname="+tid+"&tsex="+tid+"&ttitle="+tid+"&tsection="+tid+"&tted="+tid,
dataType:"json",
error:function(){
alert("查询教师信息失败!");
},
success:function(data){
alert("查询教师信息成功!"+data);
var obj = eval("("+data+")");
$("#table").html("<tr><td>教工号</td><td>姓名</td><td>性别</td><td>身份证</td><td>职称</td><td>教研室</td><td>电话</td></tr>");
$("#table").append("<tr><td>"+obj.tgh+
"</td><td>"+obj.tname+
"</td><td>"+obj.tsex+
"</td><td>"+obj.tid+
"</td><td>"+obj.ttitle+
"</td><td>"+obj.tsection+
"</td><td>"+obj.tted+ "</td><tr>");
}
});
});
});
将jsonobject对象的数据设置在标签中:
$("#table").html("<tr><td>教工号:</td><td>"+obj.tgh+"</td></tr><tr><td>姓名:</td><td>"+obj.tname+"</td></tr><tr><td>性别:</td><td>"+obj.tsex+"</td></tr><tr><td>身份证:</td><td>"+obj.tid+"</td></tr><tr><td>职称:</td><td>"+obj.ttitle+"</td></tr><tr><td>教研室:</td><td>"+obj.tsection+"</td></tr><tr><td>电话:</td><td>"+obj.tted+"</td></tr>");
java.lang.OutOfMemoryError: PermGen space:
PermGen space的全称是Permanent Generation space,是指内存的永久保存区域,
这块内存主要是被JVM存放Class和Meta信息的,Class在被Loader时就会被放到PermGen space中,
它和存放类实例(Instance)的Heap区域不同,GC(GarbageCollection)不会在主程序运行期对
PermGen space进行清理,所以如果你的应用中有很多CLASS的话,就很可能出现PermGen space错误,
这种错误常见在web服务器对JSP进行pre compile的时候。如果你的WEB APP下都用了大量的第三方jar,其大小
超过了jvm默认的大小(4M)那么就会产生此错误信息了。
解决方法:手动设置MaxPermSize大小
修改TOMCAT_HOME/bin/catalina.sh
在# OS specific support. $var _must_ beset to either true or false.上面加入以下行:
JAVA_OPTS="-server -XX:PermSize=64M-XX:MaxPermSize=300M"
建议:将相同的第三方jar文件移置到tomcat/shared/lib目录下,这样可以达到减少jar文档重复占用内存的目的。
js如何获取jsp页面中嵌入的java代码中的变量:
在js中可以这样去获取
1 | var name = "<%=name %>"; |
注:必须要引号!
Jquery ajax传参数到action后台:
$.ajax({
type:"post",
url:"myfoodaction_deleteFood.action",
data:"username="+getusername+"&food="+getfoodname+"&rice="+getfoodrice+"&number="+getfoodnumber,
dataType:"html",
success:function(){
alert("删除成功!");
}
});
AJAX 中文参数需要编码后传给服务端,然后在服务端用utf-8解码,因为ajax(post请求)默认是utf-8编码,所以最好直接使用post请求!而get的请求则不一样;get请求不走filter
需要在js端用两次编码!
注意!!!!.传递中文
记住永远不要在浏览器的地址栏中传递中文。在传递中文前先进行编码
@Override
public String execute() throws Exception {
// TODO Auto-generated method stub
username=URLEncoder.encode("郭蕾","utf-8");//先进行编码
System.out.println(username);
return "redirect";
}
查询所有数据:
hibernatetmplate.loadAll(UserBean.class);
查询满足条件的数据:
hibernatetmplate.find("fromUserBean user where user.username=? anduser.userpassword=?",newString[]{user.getUsername(),user.getUserpassword()});
更新修改数据:
ArrayList<FoodBean>list=new ArrayList<FoodBean>();
list=(ArrayList<FoodBean>) hibernatetmplate.find("from FoodBean food wherefood.username=? and food.food=?",new String[]{food.getUsername(),food.getFood()});
if(list!=null&&list.size()>0){ //如果用户已经添加过此类商品,则更新商品数量即可;
FoodBean foodbean = (FoodBean)hibernatetmplate.get(FoodBean.class, list.get(0).getId());
foodbean.setNumber(list.get(0).getNumber()+food.getNumber());
hibernatetmplate.update(foodbean);
}
<a href="myuseraction_loginin?username=<%=session.getAttribute("username")%>&userpassword=<%=session.getAttribute("userpassword")%>" >返回首页</a>
window.location.href="User_logout.action";
window.location.href="login.jsp?prePage="+curPage;
1.其实用到method={数字}的时候,相应的前面的action是要出现*通配符来搭配的。比如一个小例子:
<action name="user_*"class="UserAction" method="{1}">
在对应的jsp中:
<form action="user_userLogin2" method="post">
那么struts会将user_userLogin2这个action按照user_*的格式解析,把*号对应位置的字符串取出来,放到method={}这个中括号里替代数字的位置,1就是指第一个*号位置的字符串。
这里看不出数字不同的区别,在:
<action name="*_*"class="com.xy.{1}Action" method="{2}">
中就看得明白了,你提交的action都会按格式分解,比如jsp里是User_add,那么就会变成:
class="com.xy.UserAction"method="{add}"
2.javascript:是表示在触发<a>默认动作时,执行一段JavaScript代码,而 javascript:;表示什么都不执行,这样点击<a>时就没有任何反应.
<ahref="javascript:checkUserLogin()">个人中心</a>
<ahref="register.jsp">注册</a>
Hibernate 的HQL和sql有什么区别:
sql 面向数据库表查询 hql 面向对象查询 hql : from 后面跟的类名+类对象 where 后用对象的属性做条件 sql: from 后面跟的是表名 where 后用表中字段做条件 在Hibernate中使用查询时,一般使用Hql查询语句。 HQL(Hibernate Query Language),即Hibernate的查询语言跟SQL非常相像。不过HQL与SQL的最根本的区别,就是它是面向对象的。
ArrayList<UserBean> list=new ArrayList<UserBean>();
list=(ArrayList<UserBean>) hibernatetmplate.find("from UserBean user where user.username=? anduser.userpassword=?",newString[]{user.getUsername(),user.getUserpassword()});
session为内置对象的原理:session的产生时间是在用户发送请求后,服务器将jsp编译成servlet时调用HttpSession session =HttpServletRequest.getSession(true);才产生的!并不是session在有客户端访问时就被创建。
一个session就是一系列某用户和服务器间的通讯。服务器有能力分辨出不同的用户。一个session的建立是从一个用户向服务器发第一个请求开始,而以用户显式结束或session超时为结束。
其工作原理是这样的:
1.当一个用户向服务器发送第一个请求时,服务器为其建立一个session,并为此session创建一个标识号;
2.这个用户随后的所有请求都应包括这个标识号。服务器会校对这个标识号以判断请求属于哪个session。
这种机制不使用IP作为标识,是因为很多机器是通过代理服务器方式上网,没法区分每一台机器。
对于session标识号(sessionID),有两种方式实现:cookies和URL重写。
HttpSession的使用
我们来看看在API中对session是如何定义和操作的。
当需要为用户端建立一个session时,servlet容器就创建了一个HttpSession对象。其中存储了和本session相关的信息。所以,在一个servlet中有多少个不同用户连接,就会有多少个HttpSession对象。
使用的机理是:
1.从请求中提取HttpSession对象;
2.增加或删除HttpSession中的属性;
3.根据需要关闭HttpSession或使其失效。
在请求中有两个重载的方法用来获取HttpSession对象。
HttpSession getSession(boolean create)/getSession();作用是提取HttpSession对象,如果没有自动创建。
获取到HttpSession对象后,我们就需要使用HttpSession的某些方法去设置和更改某些参数了。如:
void setAttribute(String name, Object value);
Object getAttribute(String name);
void removeAttribute(String name);
在Java中,HTTP的Session对象用javax.servlet.http.HttpSession来表示。
1、概念:Session代表服务器与浏览器的一次会话过程,这个过程是连续的,也可以时断时续的。在Servlet中,session指的是HttpSession类的对象.
1、session在何时被创建
一个常见的误解是以为session在有客户端访问时就被创建,然而事实是直到某server端程序调用HttpServletRequest.getSession(true)这样的语句时才被创建,注意如果JSP没有显示的使用 <% @pagesession="false"%> 关闭session,则JSP文件在编译成Servlet时将会自动加上这样一条语句 HttpSession session = HttpServletRequest.getSession(true);这也是JSP中隐含的 session对象的来历。由于session会消耗内存资源,因此,如果不打算使用session,应该在所有的JSP中关闭它。
2、存放在session中的对象必须是可序列化的吗
不是必需的。要求对象可序列化只是为了session能够在集群中被复制或者能够持久保存或者在必要时server能够暂时把session交换出内存。
引申:
1)、访问*.html的静态资源因为不会被编译为Servlet,也就不涉及session的问题。
2)、当JSP页面没有显式禁止session的时候,在打开浏览器第一次请求该jsp的时候,服务器会自动为其创建一个session,并赋予其一个sessionID,发送给客户端的浏览器。以后客户端接着请求本应用中其他资源的时候,会自动在请求头上添加:
Cookie:JSESSIONID=客户端第一次拿到的session ID
这样,服务器端在接到请求时候,就会收到session ID,并根据ID在内存中找到之前创建的session对象,提供给请求使用。这也是session使用的基本原理----搞不懂这个,就永远不明白session的原理。
3、Session删除的时间是:
1)Session超时:超时指的是连续一定时间服务器没有收到该Session所对应客户端的请求,并且这个时间超过了服务器设置的Session超时的最大时间。
2)程序调用HttpSession.invalidate()
3)服务器关闭或服务停止
4、session存放在哪里:服务器端的内存中。不过session可以通过特殊的方式做持久化管理。
5、session的id是从哪里来的,sessionID是如何使用的:当客户端第一次请求session对象时候,服务器会为客户端创建一个session,并将通过特殊算法算出一个session的ID,用来标识该session对象,当浏览器下次(session继续有效时)请求别的资源的时候,浏览器会偷偷地将sessionID放置到请求头中,服务器接收到请求后就得到该请求的sessionID,服务器找到该id的session返还给请求者(Servlet)使用。一个会话只能有一个session对象,对session来说是只认id不认人。
6、session会因为浏览器的关闭而删除吗?
不会,session只会通过上面提到的方式去关闭。
7、同一客户端机器多次请求同一个资源,session一样吗?
总结下:对于多标签的浏览器(比如360浏览器)来说,在一个浏览器窗口中,多个标签同时访问一个页面,session是一个。对于多个浏览器窗口之间,同时或者相隔很短时间访问一个页面,session是多个的,和浏览器的进程有关。对于一个同一个浏览器窗口,直接录入url访问同一应用的不同资源,session是一样的。
8、session是一个容器,可以存放会话过程中的任何对象。
9、session因为请求(request对象)而产生,同一个会话中多个request共享了一session对象,可以直接从请求中获取到session对象。
10、其实,session的创建和使用总在服务端,而浏览器从来都没得到过session对象。但浏览器可以请求Servlet(jsp也是Servlet)来获取session的信息。客户端浏览器真正紧紧拿到的是session ID,而这个对于浏览器操作的人来说,是不可见的,并且用户也无需关心自己处于哪个会话过程中。
COOKIE和SESSION有什么区别?
作者:轩辕志远
链接:https://www.zhihu.com/question/19786827/answer/28752144
来源:知乎
著作权归作者所有,转载请联系作者获得授权。
1. 由于HTTP协议是无状态的协议,所以服务端需要记录用户的状态时,就需要用某种机制来识具体的用户,这个机制就是Session.典型的场景比如购物车,当你点击下单按钮时,由于HTTP协议无状态,所以并不知道是哪个用户操作的,所以服务端要为特定的用户创建了特定的Session,用用于标识这个用户,并且跟踪用户,这样才知道购物车里面有几本书。这个Session是保存在服务端的,有一个唯一标识。在服务端保存Session的方法很多,内存、数据库、文件都有。集群的时候也要考虑Session的转移,在大型的网站,一般会有专门的Session服务器集群,用来保存用户会话,这个时候 Session 信息都是放在内存的,使用一些缓存服务比如Memcached之类的来放 Session。
2. 思考一下服务端如何识别特定的客户?这个时候Cookie就登场了。每次HTTP请求的时候,客户端都会发送相应的Cookie信息到服务端。实际上大多数的应用都是用 Cookie 来实现Session跟踪的,第一次创建Session的时候,服务端会在HTTP协议中告诉客户端,需要在 Cookie 里面记录一个Session ID,以后每次请求把这个会话ID发送到服务器,我就知道你是谁了。有人问,如果客户端的浏览器禁用了 Cookie 怎么办?一般这种情况下,会使用一种叫做URL重写的技术来进行会话跟踪,即每次HTTP交互,URL后面都会被附加上一个诸如 sid=xxxxx 这样的参数,服务端据此来识别用户。
3. Cookie其实还可以用在一些方便用户的场景下,设想你某次登陆过一个网站,下次登录的时候不想再次输入账号了,怎么办?这个信息可以写到Cookie里面,访问网站的时候,网站页面的脚本可以读取这个信息,就自动帮你把用户名给填了,能够方便一下用户。这也是Cookie名称的由来,给用户的一点甜头。
所以,总结一下:
Session是在服务端保存的一个数据结构,用来跟踪用户的状态,这个数据可以保存在集群、数据库、文件中;
Cookie是客户端保存用户信息的一种机制,用来记录用户的一些信息,也是实现Session的一种方式。
1,session 在服务器端,cookie 在客户端(浏览器)
2,session 默认被存在在服务器的一个文件里(不是内存)
3,session 的运行依赖 session id,而 session id 是存在 cookie 中的,也就是说,如果浏览器禁用了 cookie ,同时 session 也会失效(但是可以通过其它方式实现,比如在 url 中传递 session_id)
4,session 可以放在 文件、数据库、或内存中都可以。
cookie是存在浏览器的,根据请求的路径自动发送的,服务器端可以对其进行处理
session是存在服务器的,用于区分会话和不同用户的访问
一般来说,session的识别需要cookie里的一个字段(jsessionid)来表示是哪一个session,由服务器端来识别
cookie 是一个实际存在的东西,http 协议中定义在header 中的字段。
html中form如何提交隐藏域:
在页面中的form里加入<input type="hidden" name="compId" value="2101" /> 然后你点击按钮提交表单的时候,是可以接收到compId的.
基本语法:
<input type="hidden"name="field_name"value="value">
作用:
1 隐藏域在页面中对于用户是不可见的,在表单中插入隐藏域的目的在于收集或发送信息,以利于被处理表单的程序所使用。浏览者单击发送按钮发送表单的时候,隐藏域的信息也被一起发送到服务器。
2 有些时候我们要给用户一信息,让他在提交表单时提交上来以确定用户身份,如sessionkey,等等.当然这些东西也能用cookie实现,但使用隐藏域就简单的多了.而且不会有浏览器不支持,用户禁用cookie的烦恼。
3 有些时候一个form里有多个提交按钮,怎样使程序能够分清楚到底用户是按那一个按钮提交上来的呢?我们就可以写一个隐藏域,然后在每一个按钮处加上οnclick="document.form.command.value="xx""然后我们接到数据后先检查command的值就会知道用户是按的那个按钮提交上来的。
4 有时候一个网页中有多个form,我们知道多个form是不能同时提交的,但有时这些form确实相互作用,我们就可以在form中添加隐藏域来使它们联系起来。
5 javascript不支持全局变量,但有时我们必须用全局变量,我们就可以把值先存在隐藏域里,它的值就不会丢失了。
6 还有个例子,比如按一个按钮弹出四个小窗口,当点击其中的一个小窗口时其他三个自动关闭.可是IE不支持小窗口相互调用,所以只有在父窗口写个隐藏域,当小窗口看到那个隐藏域的值是close时就自己关掉。
<form action="数值自增.ashx" method="post">
<input type="hidden"name="_viewstate" value="a" />
<input type="hidden"name="_div" value="@n" />
<!-- <input name="txt"type="text" value="@value" />-->
<div>@n</div>
<input type="submit"value="click" />
</form>
//获取隐藏域的值
string s =context.Request.Form["_div"];
hibernate.cfg.xml中如何设置mysql生成表的编码方式:
hibernate的配置文件中加入: <property name="connection.useUnicode">true</property> <property name="connection.characterEncoding">UTF-8</property> 另外,mysql的表,字段都应该设成utf-8的字符集 character set:utf8 collation:utf8_general_ci
而且eclipse中project的properties编码和window的preference的编码都要设置为utf-8
注:ssh中实例不能自己再new,只可以用:
ClassPathXmlApplicationContextcontext=new ClassPathXmlApplicationContext("applicationContext.xml");
DaoServiceImpldao=(DaoServiceImpl)context.getBean("myuserdaoservice");
Stringusername=session.getAttribute("username").toString();
ArrayList<FoodBean> list = new ArrayList<FoodBean>();
list=dao.findAllFood(username);
否则会出现空指针异常!
将数据库的数据显示在jsp页面:
<table border="1"align="center" cellpadding="5"cellspacing="0" >
<tr>
<td>商品名称</td>
<td>商品价格</td>
<td>商品数量</td>
<td>删除</td>
<td>修改</td>
</tr>
<%
ClassPathXmlApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml");
DaoServiceImpldao=(DaoServiceImpl)context.getBean("myuserdaoservice");
Stringusername=session.getAttribute("username").toString();
ArrayList<FoodBean> list = new ArrayList<FoodBean>();
list=dao.findAllFood(username);
for(FoodBean food:list)
{%>
<tr>
<td><%=food.getFood() %></td>
<td><%=food.getRice()%></td>
<td><%=food.getNumber() %></td>
<td><input type="button"name="delete" id="delete"value="删除"/></td>
<td><inputtype="button"name="change"id="change"value="修改"></td>
</tr>
<%}
%>
</table>
SSH用HibernateTemplate()更新需要更新的字段:
Studentstudent = (Student)dao.getHibernateTemplate().get(Student.class, id);
student.setComments(remark);
student.setStatus(status);
student.setId(id);
dao.getHibernateTemplate().update(student);
步骤:先得到待更新的对象;然后为对象设置新值;最后调用update()函数即可。
FoodBean foodbean = (FoodBean)hibernatetmplate.get(FoodBean.class,list.get(0).getId());//必须用int型的id;
foodbean.setNumber(list.get(0).getNumber()+food.getNumber());
hibernatetmplate.update(foodbean);
在Windows中的文件路径格式为 D:\source\l.c
而在Java中的文件路径格式为 D:/source/l.c
在java中使用前者则会报错,所以需要先将Windows中的文件路径转换为java中可识别的路径。
作如下处理:
String str ="D:\source\l.c";
String location =str.replaceAll("\\\\","/");
这样location的值为D:/source/l.c
Java中一个\ 用\\\\代替:
Stringlocation = fileurl.replaceAll("\\\\", "\\\\\\\\");
Stringlocation = fileurl.replaceAll("\\\\","/");
500是服务器的原因,如果代码没错可以把服务器删了重建一个服务器试试。
在web应用程序中我们都是使用部署描述符来初始化一些资源如servlet、struts2的过滤器、spring的监听器等等,这个部署描述符就是那广为人知的web.xml了。同样的,struts2也使用一个配置文件来初始化它自己的资源struts.xml,这些资源主要包括:
1.Action Classes:负责调用商业逻辑和数据访问层;
2.Results:负责返回视图(view),如JSP页面等等;
3. 拦截器(Interceptor):对请求进行预处理和后加工;拦截顾名思义就是在提交给Action的前后进行一些操作,作用是相当的大!很多业务逻辑都是靠拦截实现的,比如校验,验证登录权限,等等~~拦截器是配置的,要配置才有~~
<!-- 配置Struts2过滤器 -->
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>*.action</url-pattern>
</filter-mapping>
<!-- 注册下载servlet -->
<servlet>
<servlet-name>fileDownload</servlet-name>
<servlet-class>com.hx.action.DownloadServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>fileDownload</servlet-name>
<url-pattern>/fileDownload</url-pattern>
</servlet-mapping>
servlet访问的地址:
<a href='/TScommunication/fileDownload?filename="+item.janame+"&fileurl="+item.jaurl+"'>下载</a>
1)换行:
studentinfo.setText("个人信息:\n"+jsonobjme.get("ssname").toString());
2)在一个Activity中结束另一个Activity的方法 下面的以ActivityB 结束ActivityA 为例: 首先在 ActivityA 中定义一个 Activity 的静态全局变量: public static Activity ActivityA; 在OnCreate()方法中给ActivityA赋值: ActivityA=this; 在ActivityB中,需要结束ActivityA时,调用 ActivityA.ActivityA.finish(); 另外,也可以在ActivityA中加入一个广播接收器,当收到广播时退出,而在ActivityB中,需要结束ActivityA时发送广播即可。 如何是从A跳转到B,结束A的话 Intent i=new Intent(A,B)satrtActivity();类名.this.finish();
当请求地址携带中文参数时,需要转换编码:
url="http://192.168.1.103:8080/TScommunication/mykcjjaction_getAllKcjjAPP.action?"+"cname="+URLEncoder.encode(data.getString("cname"), "utf-8");
或者:
Stringname=jabean.getJaname();
String newname= new String(name.getBytes("iso-8859-1"),"utf-8");
在Java的web开发中,文件下载功能的文件名文件名乱码问题是经常遇到的。
对于这个问题,不同的浏览器,解决的方法不太一样。
IE的话,通过URLEncoder对filename进行UTF8编码。
而其他的浏览器(firefox、chrome、safari、opera),则要通过字节转换成ISO8859-1了。
示例代码(通过测试):
[java] view plain copy
1. if (request.getHeader("User-Agent").toUpperCase().indexOf("MSIE") > 0) {
2. filename = URLEncoder.encode(filename, "UTF-8");
3. } else {
4. //firefox
5. filename = new String(filename.getBytes("UTF-8"), "ISO8859-1");
6. }
Javaweb项目读取doc文件:(使用POI插件)
InputStreamis = new FileInputStream(new File(newanswerurl));
WordExtractorex = new WordExtractor(is);
Stringallanswer = ex.getText();
为Textview添加滚动条了:
1. /res/layout/main.xml
把TextView修改为这样:
<TextView android:id="@+id/tv"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:singleLine="false"
android:scrollbars="vertical"
android:text=""
/>
2./src/your/pakeage/src.java
//TextView
TextView tv=(TextView)findViewById(R.id.tv);
tv.setMovementMethod(ScrollingMovementMethod.getInstance());
3.编译后就可以用TextView里面的文字滚动起来了。
inputstream转为string:
BufferedReaderreader = new BufferedReader(new InputStreamReader(urlConn.getInputStream(),"UTF-8")); // 实例化输入流,并获取网页代码
String s; // 依次循环,至到读的值为空
StringBuilder sb = new StringBuilder();
while ((s = reader.readLine()) != null) {
sb.append(s);
}
reader.close();
String str = sb.toString();
String字符串转输入流:
ByteArrayInputStream tInputStringStream = new ByteArrayInputStream(sInputString.getBytes());
写入文件,并设置文字编码:
String line = null;
// 自行调整charset即可
BufferedReader br = new BufferedReader (new InputStreamReader (new FileInputStream ("c:/content1.txt"), "GBK"));
BufferedWriter bw = new BufferedWriter (new OutputStreamWriter (new FileOutputStream ("c:/content1.txt"), "UTF-8"));
while (( line = br.readLine () ) != null)
{
if (line.contains (id))
bw.write (line);
}
bw.flush ();
bw.close ();
br.close ();
}