目录
知识点
不支持
恶心事
与C#的区别
组件
学习资料
母版页
静态方法,即可以在类上被调用,也可以在实例对象上被调用。
Java类 先执行静态构造函数,再执行静态方法或静态字段,所以如果在类的静态构造函数中,执行了该类的静态方法,则会报错。因为类还没有初始化,不能调用类方法,这一点和C#不同。以下代码报错:
public class obj{ static{ Init(); } public static void Init(){} }
使用 import static 包.类.*; 可以直接使用该类下的方法。
类上可以定义代码段,在执行完构造函数之后执行。如:
public class test{ {system.out.println("OK");} {system.out.println("22");} }
一些考点: http://www.cnblogs.com/lanxuezaipiao/p/3371224.html
在 target/@/Web-inf/classes
executeQuery 是执行并返回结果
getResultSet 可以多次调用,仅一次执行。
ResultSet.getInt(index) 中的 index 是从 1 开始的。
1. 不支持分部类。
2. 不支持参数默认值
3. 不支持 扩展方法
4. String.Join 还是自己写吧。
5.
6. 不支持索引器, 把它改为一个方法, get(int index) 吧。List也是这么干的。
7. 没有var
9. 没有扩展方法
10. 没有属性,所以不能这样写: new Node(){ Name = "abc"}
11. 不支持运算符重载,Java作者说是不喜欢,其实是他不会。
12. 关于泛型,Java并不支持真正的泛型,作者喜欢泛型,但是水平太低,不会实现,所以仅仅做了个样子: http://blog.sina.com.cn/s/blog_44c1e6da0100cus3.html
ava中泛型实现使用的擦除机制,为类型参数传入类型并不导致新类型出现,即传入了类型参数后在运行时仍然完全不知道类型参数的具体类型!
13. 定义方法可以抛出异常,调用方法必须使用 try catch ,或也抛出同样的异常。 好烦!
14. Java 的枚举,不能和 int 相互转换, 比如它不能从 任意一个数字转为枚举,它是一个有限集合。而C#的枚举之间可以相互运算,如 | & 等。
14.
先记录一下我问的问题和经常听到的回答:
问:我想实现C#的 MyObject.As<Int>("22"); Java如何实现? MyObject.<Integer>("22",Integer.class) 是多一个参数的。
答:你为什么那样做? 你不应该那样实现,应该针对每个类型定义函数。
析:
先弄明白一件事,是Java不能实现!
好像这是很多人的逻辑,不能实现的东西,从另一方面去说实现方案不对。 一个软件实现不了的功能,就可以说,这个功能是不合理的。
要让猪上树,先把树砍到猪能上去的高度。要让Java去实现功能,先把功能砍到Java能实现的程度。
Java 判断字符串相等不能使用 == , 而必须使用 equals
http://www.cnblogs.com/yjmyzz/archive/2012/12/10/2812079.html
配置文件不能编译,所以大量依赖就很恶心了,配置阶段谁也不敢保证它是正确的。万一解析程序更新了呢。万一 Spring9.0有了新的配置文件架构呢。
配置文件做为一个中间数据载体(可以看做是数库),应该提供一个配置工具(微软有一个web.config配置工具)!或者最起码,提供一个全部配置的,且最优化的例子。
如果静态资源进入Filter,有的时候,会是莫名其妙的 isCommited() 为 true ,为 true 之后, 就不能再进行输出了。
解决办法:通过utl-pattern 阻止静态资源进入Filter
http://blog.csdn.net/a4307515/article/details/42394869
两个包名下,同名的类名, Spring运行时出错: Servlet.init() for servlet mvc-dispatcher threw exception
解决方法:
1. 把类名改为: Admin_Home , Open_Home,保证不重名。
2. 把 @Controller 属性的构造函数里设置 Controller名称。保证里面的名称不重名。
toArray()时,返回的是 Object[],强转会出错。Java推荐使用带参数的 toArray(),但参数时,必须传入一个有空间大小的数组,toArray方法进行填充并返回(我想骂)
Java有很多方法,并不会返回 null ,而是抛出异常!
Class.getField ,如果没有该列,则报: NoSuchFieldException ,而不是返回null
如果函数抛出异常,需要要函数上显式进行定义。 我去年买了个表,Java设计者。
我想:在定义函数时不定义抛出异常,但出现异常的时候还要抛出异常!!!
只好对异常规范进行修改。
想抛出异常的时候,运行一个函数 Throw("异常消息"); Throw方法产生一个运行时异常。
private static class MyException extends RuntimeException { public MyException(String msg) { super(msg); } } public static void Throw(String msg){ System.out.println("自定义运行时异常:"+ msg); } public static void Throw(Exception e){ System.out.println(e.getMessage()); MyException exp = new MyException(e.getMessage()); exp.setStackTrace(e.getStackTrace()); throw exp; }
在catch 完异常之后, 调用 MyObject.Throw(e); 如下:
public static void Do() { try { delete = (ActionClipBase) this.getClass().newInstance(); } catch (Exception e) { MyObject.Throw(e); } }
这样,抛出运行时异常来达到停止代码执行的目的。
源码根文件夹,下面不能有类。
如: java做为Sources Root,下面只能是文件夹。不能是类。
虽然 int 和 Integer 可以相互转换,但是 数组不能相互转换。
ArrayUtils.toPrimitive
1. List是一个接口,使用: LinkedList<T>
2. 导入常用包:
import java.util.*;
3. Java8的 lambda表达式,需要使用 final 修饰表达式内的变量。
final Object[] ret = {null}; .lambda(o ->{ ret[0] = true; }); //使用 ret[0]
list.removeIf(x-> x.startsWith( Prefix));
教程:
http://www.importnew.com/14841.html
http://my.oschina.net/benhaile/blog/177148
Lambda基本招式:
Collection<>
.stream()
.map()
.filter()
.collection()
4. substring, 第二个参数:C#表示Length, Java表示EndIndex。 转换: EndIndex = StartIndex + Length
5. 把 String.Empty 换成 “”
6. Array和List区别很大,函数最好返回List
7. foreach => for( int i : list)
8. 数组 Length =》 .length() ,尽量避免使用数组, 多使用 List,List有更多方法。
9. List [] => .get(index)
10. 代码自动提示 : Ctrl+ Shift + 空格
11. 值类型与引用类型有很大使用上的区别,值类型都有一个引有类型和它对应。 int => Integer , boolean=>Boolean ,这个设计,我也是醉了。
12. HttpContext.Current.Item[] => request.setAttribute(key,val) , request.getAttribute(key)
13. Action => Consumer 一个参数 , BiConsumer 二个参数 。
14. Function => Supplier 没有参数, Function 一个参数 , BiFunction 两个参数
参考:http://www.java3z.com/cwbwebhome/article/article20/200101.html?id=4970
15. Server.MapPath => ServletContext.getRealPath
16. Java 的静态构造函数写法非法简洁。只需要一个 static 即可。
17. C# 之于 ThreadStatic, Java 之于 ThreadLocal : http://my.oschina.net/doctor2014/blog/396162
18. Switch 枚举中 case 不必写枚举名, 这一点比 C# 好。
19. C# Attribute 使用 []修饰, Java使用 @
20. C#可以定义两个类: List<T> : List ,而Java里,只需定义 List<T> , 使用时,可以使用 : List<T> ,List ,List<?>三种方式
21. C# 的 lock => Java 的 synchronized , ReentrantLock 。 : http://www.cnblogs.com/dolphin0520/p/3923167.html
优先使用 ReentrantLock
22. Java的一切异常是出错的,比如强制类型转换,而 .Net 不会出错,从这一点上来说, .Net 性能会更高。
if( Obj instanceof String){
String strVal = (String) Obj;
...
}
23. C# Web.config 自定义 AppSettings => Bean 属性注入。 字段怎么注入?!
24. C# : Application_Start 需要一个 Global.asax 文件。 而Java则需要 实现 WebApplicationInitializer 的类,不需要配置。可以有多个:
http://docs.spring.io/spring/docs/4.0.0.RELEASE/javadoc-api/
1. 实现C# 的 using ,使用 import 包名.*;
2. 使用 Response,在action参数中添加: HttpServletResponse ,同理还有: HttpServletRequest 。
获取HttpContext.Current 上下文: http://blog.csdn.net/yanjiaye520/article/details/26602679
需要在
<!-- WEB.XML中配置相关的监听机制 --> <listener> <listener-class> org.springframework.web.context.request.RequestContextListener </listener-class> </listener>
使用:
//在任意的class下通过以下方法获取到HttpServletRequest HttpServletRequest request = ((ServletRequestAttributes)RequestContextHolder.getRequestAttributes()).getRequest();
3. 修改编码为 UTF8 , 修改 Tomcat 的编码为 UTF8 http://www.it165.net/admin/html/201503/5139.html
4. Project Structure 里,修改Modules里的Spring项目的 Language Level为 8 : Lambda 时,编译报错。
5. URL大小写: http://blog.csdn.net/k_scott/article/details/8254932
6. 返回的 Action: http://www.360doc.com/content/14/0309/19/834950_359081989.shtml
7. 输出Filter,参考:
http://blog.csdn.net/wubai250/article/details/8552960
http://www.cnblogs.com/lhj588/archive/2012/07/06/2579188.html
url-pattern 设置:
*.jsp 时不起作用
/ 仅Mvc页面程序处理!!!
*包含:.jsp , *.js , *.css 等,太烦了。
对指定路由使用Filter
<!-- HTML特殊字符过滤器--> <filter> <filter-name>HTMLFiter</filter-name> <filter-class>com.cv.mvc.common.helper.HttpContext</filter-class> </filter> <filter-mapping> <filter-name>HTMLFiter</filter-name> <url-pattern>/Hr/*</url-pattern> <url-pattern>/Person/*</url-pattern> <url-pattern>/Open/*</url-pattern> <url-pattern>/Sys/*</url-pattern> <url-pattern>/Test/*</url-pattern> </filter-mapping>
在Filter中,也可以设置当前的 Request 和 Response
public class HttpContext implements Filter { private ServletContext servletContext = null; private HttpServletRequest myRequest = null; private MyHttpResponseWrapper myResponse = null; public static ThreadLocal<HttpServletRequest> Request = new ThreadLocal<HttpServletRequest>(); public static ThreadLocal<HttpServletResponse> Response = new ThreadLocal<HttpServletResponse>(); @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { myRequest = (HttpServletRequest) request; myResponse = new MyHttpResponseWrapper((HttpServletResponse) response); Request.set(myRequest); Response.set(myResponse); } public static HttpServletRequest getRequest(){ if( Request == null || Request.get() == null){ System.out.printf("Web.xml没有配置该路由,导致Request为空,将从RequestContextHolder返回Request对象!"); return ((ServletRequestAttributes)RequestContextHolder.getRequestAttributes()).getRequest(); } return Request.get(); } public static HttpServletResponse getResponse(){ return Response.get(); } public static HttpSession getSession(){ return getRequest().getSession(); } }
7.1使用:HandlerInterceptorAdapter http://blog.csdn.net/liuwenbo0920/article/details/7283757
8. 访问静态资源,Web的根在哪?
根:Project Structure—》Modules -》 Web -》 Web Resource Directories -> 有 《Path Relative To Deployment Root》 一项,该值应该是 “/" , 左边的 Web Resource Directory 就是根:默认指向 main\webapp
由于在 web.xml中,指定了所有的页面程序程序,所以需要单独设置静态资源的处理程序。: http://www.cnblogs.com/rollenholt/archive/2012/12/26/2834209.html
如下设置:
<servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.jpg</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.js</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.css</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>mvc-dispatcher</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping>
如果设置了 Filter,则静态资源也会进入到Mvc-Dispatcher。防止静态资源进入Filter
<filter> <filter-name>HTMLFiter</filter-name> <filter-class>BaseMvc.MyResponseFilter</filter-class> </filter> <filter-mapping> <filter-name>HTMLFiter</filter-name> <url-pattern>/Admin/*</url-pattern> <url-pattern>/Open/*</url-pattern> <url-pattern>/Sys/*</url-pattern> </filter-mapping>
9. HttpServletResponse 有 setStatus 方法,但是没有 getStatus 方法,有文章说: http://blog.01000.name/http-servlet-response-status/
解决方案:http://yingzhuo.iteye.com/blog/1844714 + http://www.iteye.com/problems/41733
在自己的包装器里,重写 setStatus :
public class MyHttpResponseWrapper extends httpServletResponseWrapper { int httpStatus; @Override public void setStatus(int sc) { httpStatus = sc; super.setStatus(sc); } public int getStatus() { return httpStatus; } }
https://github.com/sitemesh/sitemesh3
10. @ResponseBody 表示返回内容不包含视图,所有内容都在函数中处理了,相当于.Net 里的 Content() ,或 Json()。
11. getContextPath、getServletPath、getRequestURI的区别
http://my.oschina.net/xsh1208/blog/177522
公认: SmartJson 最快: https://github.com/netplex/json-smart-v2
1. Spring Controller: http://my.oschina.net/hcliu/blog/396887
2. Spring源码: http://www.cnblogs.com/xing901022/p/4178963.html
3. HttpServletResponseWrapper: http://www.mzone.cc/article/260.html
4. 进阶: http://blog.csdn.net/it_man/article/details/7556903
5. Sitemesh3 : http://www.cnblogs.com/luotaoyeah/p/3776879.html
6. 反射 : http://www.cnblogs.com/penghongwei/p/3300084.html
判断声明类型: getModifiers : http://blog.csdn.net/zhou8622/article/details/44038699
7. BasicDataSource: http://my.oschina.net/DeanCTO/blog/323567
8. Jdbc: http://www.codingdiary.com/developers/developers/diary/javaapi/java/sql/SampleCode/ResultSetfindColumnExampleCode.html
9. Web中获取路径: http://blog.csdn.net/poplong/article/details/9734701
webapp(Tomcat根)
web-inf
pages(Spring根)
web.xml
Admin...(Mvc_Area)
Home (Mvc_Controller)
Index.jsp
Html(母版页位置)
Admin.html(对应Mvc_Area的母版页)
Admin2.html(另一个Mvc_Area的母版页)
Res(资源源文件)
R(生成的资源文件)
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <% request.setAttribute("Layout","~/Html/Open.html"); %> <def id="title" >我是首页</def> <def id="body" /> 内容随便写。 都在 body 里。
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title><def id=title /></title> <script src="/R/MyJs_Open.js"></script> <link href="~/R/MyCss_Open.css" rel="stylesheet"> </head> <body> <def id=body /> </body> </html>
子页面使用 <% request.setAttribute("Layout","~/Html/Open.html"); %> 声明母版页位置。
母版页和子页使用 def 标签的 进行关联, 子页的def 内容填充到母页的 def 元素内,并去除 def 标签。
子页的 def 定义有两种方式:
推荐方式:
<def id="body"> Body内容区 </def>
或者,自闭合方式
<def id="body" /> 下面全部是Body的内容。直到遇到下一个 def 标签。
母版页定义的 def 元素标签:
1. 允许有内容,内容将在加载子页面后,被移除。
2. 标签如果是自闭合。推荐。
母子页面自动关联 def中没有定义 id的def元素。仅关联第一个匹配的。
母页面使用 @变量名 来接收子页面 request.setAttribute 的 Key值。
public static HttpServletRequest getRequest(){
if( Request == null || Request.get() == null){
System.out.printf("Web.xml没有配置该路由,导致Request为空,将从RequestContextHolder返回Request对象!");
return ((ServletRequestAttributes)RequestContextHolder.getRequestAttributes()).getRequest();
}
return Request.get();
}
/** * 从一个包中找出所有的类,不包括jar包 * @param packageName * @return * @throws IOException * @throws ClassNotFoundException */ @SuppressWarnings("rawtypes") public static List<Class> getClasses(String packageName) throws IOException, ClassNotFoundException { ClassLoader classLoader = Thread.currentThread() .getContextClassLoader(); String path = packageName.replace(".", "/"); System.out.println("Path:"+path); Enumeration<URL> resources = classLoader.getResources(path); List<File> dirs = new ArrayList<File>(); while (resources.hasMoreElements()) { URL urlResource = resources.nextElement(); dirs.add(new File(urlResource.getFile())); } List<Class> classes = new ArrayList<Class>(); for (File directory : dirs) { classes.addAll(findClasses(directory, packageName)); } return classes; } @SuppressWarnings("rawtypes") private static List<Class> findClasses(File directory, String packageName) throws ClassNotFoundException { List<Class> classes=new ArrayList<Class>(); if(!directory.isDirectory()){ return classes; } File[] files=directory.listFiles(); for(File file:files){ if(file.isDirectory()){ assert !file.getName().contains("."); System.out.println(packageName+"."+file.getName()); classes.addAll(findClasses(file,packageName+"."+file.getName())); }else if(file.getName().endsWith(".class")){ classes.add(Class.forName(packageName+"."+file.getName().substring(0, file.getName().length()-6))); } } return classes; }
源自: http://bbs.csdn.net/topics/390716276
2.