web远程调试
------------------------------------------------------------------------------
-------------------------------------------------------------------------------
GSON
通过JsonReader解析Json数据
JsonReader reader = new JsonReader(new StringReader(jsonData));
通过Gson解析Json数据
InputStream inputStream = getAssets().open(name);
Foo01 foo = new Gson().fromJson(getStrFromAssets("Json01"), Foo01.class);
gsonBuilder可以通过检查json数据的格式,将符合用户设置格式的数据变为相应的对象,即
GsonBuilder用来定制java跟json之间的转换格式
1 概述
标量: | String, numbers |
序列: | 数组(array), 列表(List) |
映射: | 散列(hash),字典(dic) |
2 简单转换
集合对象转json | String jsonObj =gson.toJson(user); |
集合字符串转json | String jsonStr =gson.toJson(strs); |
json转集合对象 | Type typeObj = new TypeToken<List<User>>(){}.getType(); users=gson.fromJson(jsonObj,typeObj); |
json转字符串对象 | Type typeObj = new TypeToken<List<String>>(){}.getType(); users=gson.fromJson(jsonObj,typeObj); |
3 GsonBuilder
用来定制java跟json之间的转换格式
excludeFieldsWithoutExposeAnnotation() | 不导出实体中没有用@Expose注解的属性 |
SetPrettyPrinting() | 将结果进行格式化 |
4 集合的处理,一对多处理
enableComplexMapKeySerialization() | 启用对map键(key)的序列化,否则将得到对象的hash地址 |
5 TypeAdapter
可以理解成自定义序列化和反序列化。
自定义EntrySerializer类实现JsonSerializer、JsonDeserializer接口。
----------------------------------------------------------------------------------------------------
HTTP
请求头: | Referer:用来做统计和防盗链 User-agent:用来获取浏览器信息 |
响应头: | refresh:定时跳转 Location:重定向的头 Content-type:设置字符编码 |
响应状态码: | 200:正常响应 302:重定向 304:缓存读取 404:资源不存在 405: 500:服务器报异常 |
错误状态的解决方案: | --可以设置错误页面跳转(二选一) <error-page> <error-code>404</error-code> <location>/error1.html</location> </error-page> <error-page> <exception-type>java.lang.Exception</exception-type> <location>/error2.html</location> </error-page> |
Servlet
实现Servlet或者继承Servlet的实现类
方法一 | 实现Servlet接口 并实现init(),service(),destory()等生命周期的方法 |
方法二 | 继承GenericServlet(Servlet的实现类) |
方法三 | 继承HttpServlet(继承自GenericServlet) |
ServletConfig接口 | String getInitParamter(String name) Enumeration getInitParamterNames() 获取所有初始化参数名 |
ServletContext对象 | ServletConfig.getServletContext() getServletContext().getInitParamter(String name) getServletContext().getInitParamterNames() |
Request
封装了浏览器发送过来的所有请求信息。
1 请求首行(POST URL HTTP/1.1) | getMethod():获取请求方式 getContextPath():获取上下文路径,即项目名 getQueryString():获取请求参数 getRequestURL(): getRequestURI(): getServletPath():获取servlet路径 getRemoteAddr():获取IP地址 getRemoteHost():获取主机名 getScheme():获取协议 |
2 请求头 | Request.getHeader(String name) 常见的请求: Referer:请求来源 User-agent:表示浏览器信息 |
3 请求空行 |
|
4 请求正文(post才有) | Request.getParameter(String name);//根据参数名称获取相应参数值 Map<String, String[]> get ParamerMap() Enumeration getParamerNames()//获取所有参数名称 String[] getParamerValues(String name)
Request.getReader() |
5 乱码解决 | 根本原因:编码和解码用的码表不一致导致的。服务器采用utf-8格式编码,而浏览器默认采用ISO-8859-1解码 响应乱码解决: Response.setCharacterEncoding("utf-8")//一般不使用 --服务器自己编码 Response.setContent("text/html;charset=utf-8");//一般用这个 --服务器告诉浏览器用什么方式解码 get请求乱码(服务器响应): 设置conf/server.xml中的URIEncoding="utf-8" post请求乱码(服务器响应): 编码:response.getOutputStream().write("").getByte("utf-8");//字节编码 或者:response.setCharacterEncoding("utf-8");//字符流编码 解码:response.setHeader("ContentType","text/html;charset=utf-8"); get提交乱码(客户端请求): 在tomcat/config/server.xml添加属性 URIEncoding="utf-8" 或者:String name = new String(request.getParameter("name").getBytes("ISO-8859-1"), "utf-8"); post提交乱码(客户端请求): Request.setCharacterEncoding("utf-8"); |
6 请求转发与请求包含 |
|
7 重定向与转发的区别 |
|
8 post和get的区别 | get请求: 1. 表单的默认请求方式, 超链接, location.href, 定时刷新, 浏览器直接访问, 重定向都是get提交 2. get提交如果带参数, 参数只能绑定在url路径上, 参数泄露, 不安全 3. url路径最大只能是1kb, 那么对于get提交的参数具有长度的限制 4. 对于get提交的参数解决乱码, 需要重新编码再解码, 比较麻烦 Post提交: 1. 只有明确给出了form表单的method属性为post时候, 才是post提交 2. post提交的参数不需要绑定在url路径上, 它有专门的请求体, 更安全, 参数长度更大 4. Post提交处理乱码只需要 request.setCharacterEncoding("utf-8"), 处理比较方便 |
Response
就是服务器用来向浏览器响应内容的。
1 响应首行(HTTP/1.1 200 OK) | 设置状态码: setStatus(int sc) setStatus(int sc, String sm) sendError(int sc, String msg) |
2 响应头(Key Vaule) | setHeader(String name, String value) setDataHeader(String name, long date) 常见的响应头: Contype:text/html;charset=utf-8//响应编码 Refresh:3;url=http://path |
3 响应空行 |
|
4 响应正文 | 需要发送的资源: PrintWriter pw = response.getWriter()//字符流 OutputStream out = response.getOutputStream();//字节流 |
5 请求重定向 | 手动实现: Response.setStatus(302) Response.setHeader("location","http://www.baidu.com"); 直接实现: Response.setRedirect("http://www.baidu.com") |
Session/Cookie会话技术
浏览器记忆: | Cookie |
服务器记忆: | Session |
Cookie
服务器发送cookie | //创建cookie并添加到响应头中 Cookie cookie = new Cookie("name","Feathers"); Response.addCookie(cookie); |
浏览器获取Cookie | Cookie[] cookies = response.getCookies(); |
设置Cookie时间 | Cookie.setMaxAge(0);//覆盖原来的cookie,达到删除的目的 Cookie.setMaxAge(-1);//默认值,会话接受即删除 Cookie.setMaxAge(60*60*24);//有效期一周 |
浏览器发送cookie的条件 | 网站域(主机名)相同 网站路径是cookie的子路径 |
cookie设置路径 | 默认路径为发送cookie的资源所在路径 Cookie.setPath("");//手动设置 |
cookie设置主机 | 默认主机为发送cookie资源资源的服务器主机名 Cookie.setDomain("");//手动设置 |
删除cookie | Cookie.setMaxAge(0); |
Session
使用服务器session | HttpSession session = request.getSession(true);//获取服务器的session Session.setAttribute("key","value");//向session域中添加一个键值对 |
session的寿命 | Web.xml中修改<session-config>标签,默认30分钟 或者 session.setMaxInactiveInterval(int interval); |
session域的范围 | 一次会话期间 |
API | Boolean session.isNew();//判断session是否最新的 Session.getID();//获取session的ID
|
|
|
jsp和EL
Java servlet pages是一个简化的servlet设计,是一种动态标签技术,服务器端执行
常见动态网站开发技术 | Jsp java开发平台,适合大型web开发 Asp .net平台,安全性和跨平台下较差 Php 简单、高效,适合中小型web开发 开发组合lamp:linux-tomcat-mysql-php |
jsp页面组成 | 静态 内容:html 小脚本:<% %> 注释: <!-- --> html注释,客户端可见 <%-- --%> jsp注释,客户端不可见 java注释// /**/ 指令:<%@page %> 声明:<%! %> 表达式:<%= %> |
指令 | page指令: language属性:指定脚本语言,只支持java import属性:导包属性,可多次使用 pageEncoding属性:设置页面编码 contentTpye属性:解码,服务器传给客户端 autoFlush和buffer属性:缓冲区满,则自动刷新缓冲区 errorPage和isErrorPage属性:指定异常处理页面 include指令: 静态包含指令、动态包含指令 taglib指令: 导入标签指令 |
EL表达式 | 替代jsp表达式的脚本<%= %> 格式:&{表达式} |
|
|
----------------------------------------------------------------------------------------------
JPA
Java Persistence API 可以将普通的java对象(pojo)映射到数据库。而这些普通的java对象被称作Entity Bean.
hibernate中@Entity和@Table的区别:
@Entity说明这个class是实体类,并且使用默认的orm规则,即class名即数据库表中表名,class字段名即表中的字段名
如果想改变这种默认的orm规则,就要使用@Table来改变class名与数据库中表名的映射规则,@Column来改变class中字段名与db中表的字段名的映射规则
@Column注释定义了将成员属性映射到关系表中的哪一列和该列的结构信息,属性如下:
1)name: | 映射的列名。如:映射tbl_user表的name列,可以在name属性的上面或getName方法上面加入; |
2)unique: | 是否唯一; |
3)nullable: | 是否允许为空; |
4)length: | 对于字符型列,length属性指定列的最大字符长度; |
5)insertable: | 是否允许插入; |
6)updatetable: | 是否允许更新; |
7)columnDefinition: | 定义建表时创建此列的DDL; |
8)secondaryTable: | 从表名。如果此列不建在主表上(默认是主表),该属性定义该列所在从表的名字。 |
@Id注释指定表的主键,它可以有多种生成方式:
1)TABLE: | 容器指定用底层的数据表确保唯一; |
2)SEQUENCE: | 使用数据库德SEQUENCE列莱保证唯一(Oracle数据库通过序列来生成唯一ID); |
3)IDENTITY: | 使用数据库的IDENTITY列莱保证唯一; |
4)AUTO: | 由容器挑选一个合适的方式来保证唯一; |
5)NONE: | 容器不负责主键的生成,由程序来完成。 |
@Entity | 指出该Java为实体类,将映射到指定的数据库表,标注在实体类声明语句之前 |
@Table | 当实体类和其映射的数据库表名不同时标注 |
@Id | 主键 |
@GeneratedValue | JPA提供,用于标注主键的生成策略,通过strategy属性指定。Generator = "uuid" |
@GenericGenerator | Hiberate提供,Name = "uuid",strategy = "uuid"。uuid是根据内部程序计算出32位长度的唯一id |
@Getter |
|
@Setter |
|
@Expose |
|
@JsonIgnore | 返回前端是忽略该属性 |
@Transient | 映射到数据库时忽略该属性,即数据库不需要该字段 |
@ManyToMany | Fetch = Fetch.EAGER,多对多的关联关系 |
@TemporaL | 注释用来指定java.util.Date或java.util.Calender属性与数据库类型date、time或timestamp中的那一种类型进行映射。@Temporal(value=TemporalType.TIME) |
映射规则:
1、实体类必须用@javax.persistence.Entity进行注解
2、必须用@javax.persistence.Id进行注解一个主键;
3、实体类必须拥有一个public或者protected无参的构造函数;
4 、如果实体类需要远程方式调用,则必须实现implements Java.io.Serializable接口
JPA的两种注解方式(二选一):
基于字段的注解:将注解放置在字段前
基于属性的注解:将注解放置在getter方法前
@SecondaryTable | 将一个实体类映射到数据库的两张或更多的表中 |
@Embeddable | 嵌套映射(实体中嵌套实体),不用重写hashCode()和equals()方法 |
JPA是java ee的标准ORM接口,也是ejb3规范的一部分。
Hibernate是流行的ORM框架,是JPA的实现。
Hibernate是一个开放源代码的ORM(对象关系映射)框架。它对JDBC进行了非常轻量级的对象封装,使得JAVA程序员可以随心所欲的使用对象编程的思想来操作数据库。
handler method 参数绑定常用的注解,我们根据他们处理的Request的不同内容部分分为四类:(主要讲解常用类型)
A、处理requet uri 部分(这里指uri template中variable,不含queryString部分)的注解: @PathVariable;
B、处理request header部分的注解: @RequestHeader, @CookieValue;
C、处理request body部分的注解:@RequestParam, @RequestBody;
D、处理attribute类型是注解: @SessionAttributes, @ModelAttribute;
finalQueryOptions.Builder<Project>queryOptionsBuilder=newQueryOptions.Builder<>();
peojectTemplatesList=projectManagerService.getProjectList(queryOptionsBuilder.add(newQueryShareFilter()).build());
renderResponse(response,HttpStatus.OK,peojectTemplatesList);
1 google.gson
Gson是Google出品的一个JSON解析library,它可以将任意的Java对象转换为JSON string,也可以将JSON string转换为对应的Java对象。
2 Collections.unmodifiableMap()
返回指定映射的不可修改视图。试图修改返回的映射,将导致抛出 UnsupportedOperationException.
3 JPA @PersistenceContext
4 jupyter 文件位置配置有问题
Java 复制对象(针对对象)
浅拷贝(一般对象)
深拷贝(对象中嵌入对象)
--对象之间传递的是引用
一般步骤是(浅复制):
1. 被复制的类需要实现Clonenable接口(不实现的话在调用clone方法会抛出CloneNotSupportedException异常) 该接口为标记接口(不含任何方法)
2. 覆盖clone()方法,访问修饰符设为public。方法中调用super.clone()方法得到需要的复制对象,(native为本地方法)
下面对上面那个方法进行改造: