您的位置:首页 > 编程语言 > Java开发

Java小知识

2016-04-25 12:00 483 查看
本文记下平时工作中整理到的一些问题和知识,会随时更新增加新的小知识:

1、

Map a = new HashMap();
List b = new ArrayList();
for(int i=0;i<5;i++){
a.put("a1", i+"11");
a.put("a2", i+"22");
b.add(a);
}
for(int i=0;i<b.size();i++){
System.out.println(b.get(i).toString());
}


这是错误代码!应该将map对象 a 放入for循环内重新new 个对象,这样才准确的将每个对象增加到list集合中了。目前这样输出的为:

{a1=411, a2=422}
{a1=411, a2=422}
{a1=411, a2=422}
{a1=411, a2=422}
{a1=411, a2=422}


2、mysql在使用limit(0,n),下标从0开始,n条数据,使用该方法时最好放在sql最后,如果放在条件之后可能会影响到最终结果;

3、运行下面的代码:

public static void main(String[] args) {
getFile("E:\\aaa\\data.xml");
}

public static File getFile(String fileName) {
File file = new File(fileName);
if (!file.exists()) {
try {
file.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
}
return file;
}


当文件夹不存在的时候,

会报错:java.io.IOException: 系统找不到指定的路径。

或者英文:java.io.IOException: No such file or directory

解决方法:要先建立目录(即文件夹)才能创建文件!(即先要有目录aaa,才能创建文件data.xml)。

4、设置eclipse console 显示条数:

window–>preference–>run/debug–>console

设置limit console output 为false,方便调试时,查看全部console。

5、在sql中筛选出查询结果中只出现了一次,并且该字段的值为一个特定值

sql:select * from 表名 where 姓名 in (select 姓名 from 表名 group by 姓名 having count(*)=1)

6、servlet 是如何运行的?

当用户向浏览器地址栏输入 http://ip:port/helloweb/sayHello?name=zs

1) 浏览器使用 ip:port(端口号)连接服务器

2) 浏览器将请求数据按照 http 协议打成一个数据包(请求数据包)发送给服务器请求数据包的内容包含了请求资源路径(/helloweb/sayHello?name=zs),另外,在请求数据包当中,还会包含浏览器自动生成的一些信息。

3) 服务器创建两个对象:请求对象(Request)和响应对象(Response)服务器解析请求数据包,将解析之后的数据存放到请求对象里面,方便 servlet 读取请求数据(因为 servlet 不用解析请求数据包,如果要解析,需要理解 http 协议)。请求对象是 HttpServletRequest 接口的一个实现。响应对象是HttpServletResponse 接口的一个实现,响应对象存放 servlet 处理的结果。

4) 依据请求资源路径找到相应的 servlet 配置, 通过反射创建 servlet 实例。 然后调用其 service()方法。在调用 service()方法时,会将事先创建好的请求对象(request)和响应对象(response)作为参数进行传递。在 servlet 内部,可以通过 request 获得请求数据,或者通过 response 设置响应数据。

5) 服务器从 response 中获取数据,按照 http 协议打成一个数据包(响应数据包),发送给浏览器。

6) 浏览器会解析响应数据包,取出相应的数据,生成相应的界面。

7、servlet如何获得请求参数值?

1) String request.getParameter(String paraName);

要注意的问题: 如果 paraName 不实际的请求参数名不一致,则返回 null。

如果没有输入参数值,则返回”“。

2) String[] request.getParameterValues(String paraName);

用在有多个请求参数名相同的情况下使用。

比如 ?interest=fishing&interest=cooking

8、如何处理表单中的中文?

1) 浏览器会如何对表单中的数据进行编码?

当表单采用 post 方式提交时, 浏览器会按照打开该表单所在的页面的编码来对表单中的数据进行编码。

2) 在 html 文件当中,添加以下代码的作用

<meta http-equiv="content-type" content="text/html;charset=utf-8">


作用 1:

模拟 http 消息头(content-type),让浏览器以 utf-8 的编码格式来打开该页面(要确保 html 文件本身确定是使用 utf-8 保存的)。

作用 2:

确保浏览器按指定的编码来对表单中的数据进行编码。

3) 中文乱码解决方案

step1:

在 html 文件中,添加

<meta http-equiv="content-type" content="text/html;charset=utf-8">


另外,表单的提交方式必须是 post。

step2:

在服务器端,使用 servlet 读取表单中的请求参数时:request.setCharacterEncoding(“utf-8”);

这行代码的作用:设置解码时的编码格式。

step3:

如果 servlet 输出中文,要添加如下代码。response.setContentType(“text/html;charset=utf-8”);

这行代码的作用:

作用 1:指定 out.println 输出时所使用的编码。

作用 2:生成一个消息头 content-type:text/html;charset=utf-8,告诉浏览器,返回的数据类型是 html,编码是 utf-8。这样,浏览器一定会以指定的编码来显示该页面。

9、因为相对路径较易出错,建议在实际开发中尽量使用绝对路径

怎样写绝对路径?

链接、表单提交、重定向,绝对路径要从应用名开始写。

转发要从应用名之后开始写。

获取项目应用名方法:request.getContextPath();

10、给 web 项目的应用改名

(尤其在复制整个项目的时候此地方可能没有改过来,必须重改。)

解决方法:

a. 在项目上点右键“Prpoerties”

b. 找到 web 选项,将“Web Context-root”中默认的名字更改

比如改为 myNewWeb

11、保证业务逻辑组件之中不出现Hibernate和JDBC等持久层API,有一个重要的原因:保证业务逻辑方法的实现与具体的持久层访问技术分离。当系统需要在不同持久层技术之间切换时,系统的业务逻辑组件无须任何改变。

12、如果需要让Tomcat运行多个服务,只需要复制server.xml文件中 service 元素,并修改相应的参数便可以实现一个Tomcat运行多个服务,当然必须在不同的端口提供服务。另外我们也可以复制整个tomcat文件,然后更改端口。

13、jsp注释:

<!--注释内容-->  这种符合html注释,注释后会返回到html页面,在客户端查看源代码时能看见注释;
<%--注释内容--%> 指注释虽然写在JSP程序中,但不会发送给客户,因此在客户端查看源代码时不能看见注释。这样的注释在JSP编译时被忽略掉。


14、jsp页面会被编译成一个Servlet类,每个Servlet在容器中只有一个实例;在JSP中声明的变量是成员变量,成员变量只在创建实例时初始化,该变量的值将一直保存,直到实例销毁。(所以所有该jsp生成的页面都会共享该变量哦);

15、一段关于json的代码

//content格式:{"1":{"id":"1","name":"……","content":"……"},"2":{"id":"2","name":"……","content":"……"},"3":{"id":"3","name":"……","content":"……"}}
String contentStr = seoContList.get(0).get("content").toString();
if(!"".equals(contentStr)){
JSONObject jsonObj = JSONObject.fromObject(contentStr);
if(!jsonObj.isEmpty() && !jsonObj.isNullObject()){
Map<String,Object> seoMap = null;
Iterator it = jsonObj.keys();
while (it.hasNext()) {
seoMap = new HashMap<String,Object>();
String key = (String) it.next();
String contJsonObjStr = jsonObj.getString(key);
JSONObject contJsonObj = JSONObject.fromObject(contJsonObjStr);
String name = contJsonObj.getString("name");
String infoid = contJsonObj.getString("id");
String content = contJsonObj.getString("content");
seoMap.put("id", infoid);
seoMap.put("name", name);
seoMap.put("type", "1");
seoMap.put("content", content);
resultList.add(seoMap);
}
}
}


JSONObject jsonObj = JSONObject.fromObject(contentStr):字符串(数组等)转换成JSONObject 对象;

Iterator it = jsonObj.keys():json通过key值遍历用iterator;

String contJsonObjStr = jsonObj.getString(key):json通过key得到value值;

16、多表关联查询

select *

from A

left join B on A_user_id=B_id

left join C on A_device_id=C_id

17、jsp页面怎样只显示一段文章的前几个字,后面打上省略号……

可通过getparamert(“控件名”)能自动获取到选中value值来实现,例如:

String name = request.getParamert(“name”);

if(name.length > 10){

name = name.subString(0,10)+”……”;

}

通过该设定,可使超过10个字符的文字用省略号代替,具体要显示多少个字符,可自行修改。

18、

JSTL 字符串长度判断并截取

<c:forEach items="${newslist}" var="news" varStatus="vs">
<li>
<a href="${ctx}/news/newsQueryById.html?id=${news.id}">
<span>
${fn:substring(news.writetime,0,10)}
</span>
<c:if test="${fn:length(news.title)>'13'}">
${fn:substring(news.title,0,13)}
</c:if>
<c:if test="${fn:length(news.title)<='13'}">
${news.title}
</c:if>
</a>
</li>
</c:forEach>


19、jquery 点击事件点击元素添加和移除class

$(".smdeta-chart-lst span").click(function(){
$(this).addClass("on");
$(this).siblings().removeClass("on");
var asyzstId = $(this).attr('id');
alert(asyzstId+"--");
});


20、后台返回2/3的分数形式,js如何处理成2/3上下的形式?

<small class="colred fenshi">${sfInfoStrategyStatistic.historyBo.sameTypeSortYear}</small>
$('.fenshi').each(function(){fenshi($(this));});//js每个fenshi类都调用方法fenshi
//方法fenshi将左右形式转上下形式
function fenshi(e){
var str = e.text();
var index = str.indexOf("/");
var fenshang = str.substring(0,index);
var fenxia = str.substring(index+1,str.length);
alert(fenshang+"--"+fenxia);
str=fenshang+"<hr>"+fenxia;
e.html(str);
}


21、BigDecimal类型转指定格式字符串:

new java.text.DecimalFormat("#0.0000").format(new BigDecimal("8.65273);


22、

ajax异步请求时,如果变量和ajax有关,一定要放在ajax方法里面处理,如果放在ajax方法外面会因为异步请求的原因导致结果不正确(并不是ajax返回的值)。

$.post(url,async =false, function(data){
$List.append(data);
records=$("#recordsOfCondition").val();
alert("查询 records--"+records);

if($List.find('li').size()<records){
$List.siblings('.pro-list-more').find("em").text("滑动加载更多");
}else{
if(records==0){
$List.siblings('.pro-list-more').find("em").text("没有相关记录");
}else{
$List.siblings('.pro-list-more').find("em").text("没有更多数据");
}
Load.hide();
canScroll = false;
}
});


23、请求中中文乱码处理

String name = new String(request.getParameter("name").getBytes("iso-8859-1"), "utf-8");


24、map按存入顺序取出的方法

Map<String, Integer> map = (Map<String, Integer>)new ListOrderedMap();
map.put("a", 12);
map.put("b", 11);
map.put("c", 3);

for (String key : map.keySet()) {
System.out.println(map.get(key));
}


25、查询每个部门不重复的职位

select distinct deptno, job from emp_xxx ;

–distinct 指所有列的唯一组合

26、typeName为中文字符产品类型,如下所示点击li标签运行时报错:

<li onclick="toDetailInfo(${res.id},${res.typeName})"
<span style="color:red"> [${res.typeName}] </span>  ${res.fieldName}
</li>


报错:globalSearch:1 Uncaught ReferenceError: 私募产品 is not defined(私募产品为typeName的值);

改正:

<li onclick="toDetailInfo(${res.id},'${res.typeName}')"
<span style="color:red"> [${res.typeName}] </span>  ${res.fieldName}
</li>


在onclick方法里取值时如果是字符串值要加上单引号,el表达式只取值。

27、el表达式中${name},等级与两种取值方式:request.getAttribute(name) 和 request.getParameter(“name”);

28、

反射主要是指程序可以访问、检测和修改它本身状态或行为的一种能力。Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为Java语言的反射机制。

反射究竟有什么作用:

1,反编译:.class–>.java

2,通过反射机制访问java对象的属性,方法,构造方法等;

例如下面的strust2的配置就是反射实现的:

<action name=“product-save” class=“com.atguigu.struts2.helloworld.Product” method="save">
<result name="details">/WER-INF/pages/details.jsp</result>
</action>

将/product-save.action的请求映射到 Product类中去处理,并且去调用save方法去处理,这显然用到了反射。
Class<?> clazz = Class.forName("com.atguigu.struts2.helloworld.Product");
Method method = clazz.getMethod("save");
method.invoke(clazz.newInstance());

这样才能通过配置调用相应的类和方法


29、struts2中可以直接定义全局返回

<!-- 定义全局的Result,当前包下所有的Action都可以直接使用该Result,即相当于每个Action下都追加了该Result配置 -->
<global-results>
<result name="login" type="redirectAction">
<param name="namespace">/login</param>
<param name="actionName">toLogin</param>
</result>
<result name="error">
/WEB-INF/main/error.jsp
</result>
</global-results>


30、

@Resource、@AutoWired、@Qualifier 都用来注入对象。其中@Resource可以以 name 或 type 方式注入,@AutoWired只能以 type 方式注入,@Qualifier 只能以 name 方式注入。

但它们有一些细微区别:

1、@Resource、@Qualifier默认按 byName自动注入,@Autowired默认按byType自动注入。

2、@Resource有两个属性是比较重要的,分是name和type。如果使用name属性,则使用byName的自动注入策略。而使用type属性时则使用byType自动注入策略。

3、@Resources是JDK提供的注解,而@Autowired是Spring提供的注解。

可以把 @Resource 当成 @AutoWired @Qualifier 的老大吧,哈哈。你们有的,我都有,你们没有的,我也有~

31、mybatis缓存

http://www.cnblogs.com/zemliu/archive/2013/08/05/3239014.html

32、Java开发岗位面试题归类

http://www.banzg.com/archives/639.html

33、Spring MVC Controller默认是单例的

单例的原因有二:

a、为了性能。

b、不需要多例。

所以:

a、不要在controller中定义成员变量,在方法中定义局部变量没有关系;

b、万一必须要定义一个非静态成员变量时候,则通过注解@Scope(“prototype”),将其设置为多例模式。

34、Map底层原理:

http://blog.csdn.net/u011202334/article/details/51496381

35、

create table test_a(id int,name varchar(20));

insert into test_a values(1,’aa1’);

insert into test_a values(2,’aa2’);

insert into test_a values(3,’aa3’);

create table test_b(id int,name varchar(20),aId int);

insert into test_b values(1,’bb1’,1);

insert into test_b values(2,’bb2’,2);

insert into test_b values(3,’bb3’,2);

insert into test_b values(4,’bb4’,4);

a表一对多b表,a left join b ,如果a表在b表中有多条数据就会有多条数据;

select a.id as aid,a.name as aname,b.id as bid,b.name as bname from

test_a a left join test_b b

on a.id=b.aid;

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java