JavaWeb

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为本地方法)

下面对上面那个方法进行改造:

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值