使用jackson对json的操作

jackson是一个开源的处理json的工具包,spring mvc中的json类型响应就是用这个东西实现的,性能比较优异。我以前最早的项目用的是json-lib,后来因效率问题改为gson,现在看来可以换成jackson了。
下面给大家讲讲jackson的使用:
一、简单对象转为json
ObjectMapper om = new ObjectMapper();
StringWriter result = new StringWriter();
om.writeValue(result, 【这个参数是你要转换的东西,对象或集合都是可以的】);

当然,如果你不想用StringWriter的话,你可以直接用om.writeValueAsString(obj)直接输出字符串。

二、日期的处理
默认情况下,jackson会把日期处理为毫秒,如果你想处理成字符串,可以:
ObjectMapper om = new ObjectMapper();
om.setDateFormat(new SimpleDateFormat(“yyyy-MM-dd”));

三、排除不想要的属性
这个主要是用来解决对象间循环关联的情况的,使用如下:
SimpleBeanPropertyFilter filter = SimpleBeanPropertyFilter.serializeAllExcept(“不要的属性名”);
SimpleFilterProvider fp = new SimpleFilterProvider();
fp.addFilter(“user_json”, filter);

om.setFilters(fp);
当然,这个设置将对全局的ObjectMapper都起作用,我们也可以使用下面这种:
om.writer(fp).writeValueAsString(obj);
每次使用前再设置,这个也是全局作用域。

如果仅仅想要自己需要的属性,如下写法:
SimpleBeanPropertyFilter.filterOutAllExcept(“id”, “title”);

注意:addFilter的第一个参数,要用注解指写,比如:
@JsonFilter(“user_json”)
public class User {}
如果持久层使用的是hibernate,需要将hibernateLazyInitializer属性也排除。

四、反序列化
反序列化用的没有序列化多。我们先看普通对象的处理:
User u = om.readValue(json_str, User.class);
集合对象,处理方式不同,请看list的处理方式:
List uss = om.readValue(json_str, new TypeReference>() {});

五、图片等二进制类型的json转换
这个不用担心,jackson可直接完成转换,前提是:
你要用byte[]类型表示二进制数据,比如:private byte[] photo ;

当然,上面的的代码都是在线手工操作下的示例,jackson也是支持注解的,比如:排除属性,日期格式的定义等,都可以用注解的方式去实现,请大家自己so一下吧。

JSP九大内置对象

内置对象(隐式对象)使得开发人员可以访问容器提供的服务和资源。 内置对象在每个 JSP 页面当中都进行定义,并且在后台由容器使用。因为内置对象是自动声明的,所以我们只需要使用与一个给定对象相关的引用变量来调用其方法。内置对象不需要预先声明就可以在脚本代码和表达式中随意使用。

JSP中九大内置对象为:

请求对象request  类型 javax.servlet.ServletRequest 作用域 Request
响应对象response 类型 javax.servlet.SrvletResponse 作用域 Page
页面上下文对象pageContext 类型 javax.servlet.jsp.PageContext 作用域 Page
会话对象session 类型 javax.servlet.http.HttpSession 作用域 Session
应用程序对象application 类型 javax.servlet.ServletContext 作用域 Application
输出对象out 类型 javax.servlet.jsp.JspWriter 作用域 Page
配置对象config 类型 javax.servlet.ServletConfig 作用域 Page
页面对象page 类型 javax.lang.Object 作用域 Page
例外对象exception 类型 javax.lang.Throwable 作用域 page

request对象代表的是来自客户端的请求,例如我们在FORM表单中填写的信息等;使用它的目的是引用传递给jspService()方法的当前请求。

response对象代表的是对客户端的响应,也就是说可以通过response 对象来组织发送到客户端的数据;使用它的目的是引用发送给客户机的响应;也把它传递给jspService()方法。

pageContext对象代表的是当前页面运行的一些属性;它提供了某些便利方法和对隐式对象的存储引用。

session对象就是会话对象的使用

application对象负责提供应用程序在服务器中运行时的一些全局信息;使用它的目的是引用执行JSP所在的 Web 应用程序的环境。

out 对象代表了向客户端发送数据的对象;使用它的目的是引用JSP页面的输出流。

config对象提供一些配置信息;可以从它获取部署描述符中给定的初始化参数。

page对象,使用它的目的是引用JSP页面生成的 servlet的当前实例。

exception对象可用于把page指令属性isErrorPage设为true 的页面。它可用于异常处理。

Servlet中forward和redirect的区别

forward方式:request.getRequestDispatcher(“/somePage.jsp”).forwardrequest, response);
redirect方式:response.sendRedirect(“/somePage.jsp”);
forward是服务器内部重定向,程序收到请求后重新定向到另一个程序,客户机并不知道;redirect则是服务器收到请求后发送一个状态头给客户,客户将再请求一次,这里多了两次网络通信的来往。当然forward也有缺点,就是forward的页面的路径如果是相对路径就会有些问题了。 forward 会将 request state , bean 等等信息带往下一个 jsp
redirect 是送到 client 端后再一次 request , 所以资料不被保留.
使用 forward 你就可以用 getAttribute() 来取的前一个 jsp 所放入的 bean 等等资料

在网上看到一些帖子,总结了一些区别,可以从以下几个方面来看:

1.从地址栏显示来说

forward是服务器请求资源,服务器直接访问目标地址的URL,把那个URL的响应内容读取过来,然后把这些内容再发给浏览器.浏览器根本不知道服务器发送的内容从哪里来的,所以它的地址栏还是原来的地址.

redirect是服务端根据逻辑,发送一个状态码,告诉浏览器重新去请求那个地址.所以地址栏显示的是新的URL.所以redirect等于客户端向服务器端发出两次request,同时也接受两次response。

2.从数据共享来说

forward:转发页面和转发到的页面可以共享request里面的数据.
redirect:不能共享数据.

redirect不仅可以重定向到当前应用程序的其他资源,还可以重定向到同一个站点上的其他应用程序中的资源,甚至是使用绝对URL重定向到其他站点的资源.

forward,方法只能在同一个Web应用程序内的资源之间转发请求.forward 是服务器内部的一种操作.
redirect 是服务器通知客户端,让客户端重新发起请求.
所以,你可以说 redirect 是一种间接的请求, 但是你不能说”一个请求是属于forward还是redirect “

3.从运用地方来说

forward:一般用于用户登陆的时候,根据角色转发到相应的模块.
redirect:一般用于用户注销登陆时返回主页面和跳转到其它的网站等.

Servlet请求转发和重定向总结

Servlet中forward redirect (请求转发 重定向)自己总结
forward:请求转发
redirect: 重定向
1.在给予”/“表示当前的路径是以jsp路径为根路径来进行请求转发,属于绝对路径。 如果没有表示当前路径是以当前客户端发送请求时的路径进行请求转发,属于相对路径。
2.从这里的请求转发可以看出,servlet主要负责的并不是现实html代码,而是为了处理具体的请求转发。大致方法获得RequestDisapatcher对象 然后用其forward方法来进行请求转发:
RequestDisapatcher rd=reqest.getRequestDisapatcher();
rd.forward(req,resp); //用这里的方法来进行转发

3.HttpServletResponse 对象的SendRequest(String location)方法称作重定向,如果location地址前面加上“/ ”,则表示相对于servlet容器的根来请求,即http://localhost:8080 ,如果location地址前没有加上“/”,则表示当前请求的URI来寻找地址(就是当前的项目目录中)。
4.RequestDispather的forward(request,response)方法称为请求转发。
5.请求转发和重定向的区别:
a.请求转发:整个过程在同一个请求当中。所以在用getParameter的时候的值可以随时拿到。
b. 重定向:实际上客户端会向服务器发送两个请求。第一个请求是请求serlvet,第二个请求是服务器将结果发送到请求页面。所以getParameter是不可能得到同一个请求参数的。所以最总是是用response对象中的sendRedirect方法来重定向,也即服务器响应对象来进行重定向的.
c.RequestDisapatcher是通过调用HttpServletRequest对象的getRequestDisapatcher方法得到的。是属于请求对象的方法。
d.sendRedirect方法是属于HttpServletResposne对象的方法,即响应对象的方法,既然调用了响应对象的方法,那就表明整个请求过程已经结束了,服务器开始向客户端返回执行的结果。

6.重定向在firebug中的会有两个请求 而请求转发只有一个。本源就是请求个数。

前后两个页面 有数据传递 用请求转发,没有则用重定向。
比如servlet查询了数据需要在页面显示,就用请求转发。
比如servlet做了update操作跳转到其他页面,就用重定向。

=======================================================

1.从地址栏显示来说

forward是服务器请求资源,服务器直接访问目标地址的URL,把那个URL的响应内容读取过来,然后把这些内容再发给浏览器.浏览器根本不知道服务器发送的内容从哪里来的,所以它的地址栏还是原来的地址.

redirect是服务端根据逻辑,发送一个状态码,告诉浏览器重新去请求那个地址.所以地址栏显示的是新的URL.

2.从数据共享来说

forward:转发页面和转发到的页面可以共享request里面的数据.

redirect:不能共享数据.

3.从运用地方来说

forward:一般用于用户登陆的时候,根据角色转发到相应的模块.

redirect:一般用于用户注销登陆时返回主页面和跳转到其它的网站等.

4.从效率来说

forward:高.

redirect:低.

本质区别

解释一

一句话,转发是服务器行为,重定向是客户端行为。为什么这样说呢,这就要看两个动作的工作流程:

转发过程:客户浏览器发送http请求—-》web服务器接受此请求–》调用内部的一个方法在容器内部完成请求处理和转发动作—-》将目标资源发送给客户;在这里,转发的路径必须是同一个web容器下的url,其不能转向到其他的web路径上去,中间传递的是自己的容器内的request。在客户浏览器路径栏显示的仍然是其第一次访问的路径,也就是说客户是感觉不到服务器做了转发的。转发行为是浏览器只做了一次访问请求。

重定向过程:客户浏览器发送http请求—-》web服务器接受后发送302状态码响应及对应新的location给客户浏览器–》客户浏览器发现是302响应,则自动再发送一个新的http请求,请求url是新的location地址—-》服务器根据此请求寻找资源并发送给客户。在这里 location可以重定向到任意URL,既然是浏览器重新发出了请求,则就没有什么request传递的概念了。在客户浏览器路径栏显示的是其重定向的路径,客户可以观察到地址的变化的。重定向行为是浏览器做了至少两次的访问请求的。

解释二

重定向,其实是两次request,

第一次,客户端request A,服务器响应,并response回来,告诉浏览器,你应该去B。这个时候IE可以看到地址变了,而且历史的回退按钮也亮了。重定向可以访问自己web应用以外的资源。在重定向的过程中,传输的信息会被丢失。

例子:

请求转发是服务器内部把对一个request/response的处理权,移交给另外一个

对于客户端而言,它只知道自己最早请求的那个A,而不知道中间的B,甚至C、D。 传输的信息不会丢失。

解释三:

转发是服务器行为,重定向是客户端行为。

两者的内部机制有很大的区别:
1 请求转发只能将请求转发给同一个WEB应用中的组件,
而重定向还可以重新定向到同一站点不同应用程序中的资源,甚至可以定向到一绝对的URL。
2 重定向可以看见目标页面的URL,
转发只能看见第一次访问的页面URL,以后的工作都是有服务器来做的。
3 请求响应调用者和被调用者之间共享相同的request对象和response对象,
重定向调用者和被调用者属于两个独立访问请求和响应过程。
4 重定向跳转后必须加上return,要不然页面虽然跳转了,
但是还会执行跳转后面的语句,
转发是执行了跳转页面,下面的代码就不会在执行了。

第19章jdbc数据库编程

java数据库编程驱动类型:

JAVA数据库编程有4种驱动分类常用的就只有2种类型
(可以连接不同数据库的 JDBC)——网络协议纯java驱动
(来自客户端机器上的请求可以直接操作本地库)——本地协议纯java驱动程序

url格式:
[MySql jdbc:mysql://主机名称/端口号/数据库名(也可以用IP地址)
Oracle jdbc:oracle:thin:@主机名:端口号:数据库名
SQL Server jdbc:Sqlserver://主机名:端口号:databaseName=数据库名]

driver 驱动
Connection 连接
createStatement 连接对象
Reultset 结果集
executeupdate 修改数据库

书写标准固定格式代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
package Jdbc;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.sql.SQLException;
public class Jdbc {
Connection conn; //声明
Statement statme;
ResultSet rus;
public static void main(String [] args) {
String url="jdbc:mysql://localhost:3306/lihao"; //连接mysql 主机名+端口号+库名
String user="root";
String pawss="pronouncing";
String sql="select * from t_student "; //查询

try {
Class.forName("com.mysql.jdbc.Driver");//连接驱动
Connection conn=DriverManager.getConnection(url,user,pawss);//连接
Statement statme=conn.createStatement();//创建连接对象
ResultSet rus=statme.executeQuery(sql);//结果集(查询或执行 SQL语句)

while(rus.next()) { //邮标从第1行开始
String name=rus.getString("_name");
String age=rus.getString("_age");
String sex=rus.getString("_sex");


System.out.println(name); //打印数据查询出来的内容


}
}catch(SQLException e) {
e.printStackTrace();
}catch(ClassNotFoundException e) {
e.printStackTrace();
}
}
}