JSP9大内置对象(不需要new,可以直接用)
pageContext JSP页面容器
request 请求对象
response 响应对象
session 响应对象
application 全局对象
config 配置对象(服务器配置信息)
out 输出对象
page 当前JSP页面对象(相当于java中的this)
exception 异常对象
application 全局对象
——String getContextPath() 虚拟路径
——String getRealPath(“虚拟路径”) 绝对路径(虚拟路径 相对的绝对路径)
(内置对象不包括cookie)
四大范围对象
pageContext JSP页面容器 当前页面有效,页面跳转后无效
request 请求对象 同一次请求有效,请求转发可以拿到(服务器内部进行),重定向拿不到(返回客户端,客户端重新请求)
session 会话对象 同一次会话有效(无论怎么跳转,都有效 ,关闭切换浏览器后无效)
application全局对象 全局有效,整个项目运行期间都有效(关闭服务和其他项目无效)
尽量使用最小的范围,因为对象的范围越大,造成的性能损失越大
以上四个对象共有的方法:
Object getAttribute(String name):根据属性名,获取属性值
void setAttribute(String name,Object obj):设置属性值(新增,修改)
setAttribute(“a”,“b”) //如果a对象之前不存在,新建一个a对象,值为b
如果a之前已经存在,则将a的值改为b
void removeAttribute(String name):根据属性名,删除对象
请求转发和重定向的区别
请求转发: xxServlet收到请求,然后直接转发给yyServlet,然后yyServlet返回给客户端。整个过程中,客户端发出一个请求,收到一个响应。
重定向 :xxServlet收到请求,然后发出一个响应给客户端,客户端立即又发送一个请求访问xxServlet中给的URL,即yyServlet的路径,然后yyServlet给客户端一个响应。整个过程中,客户端发出两个请求,收到两个响应。
请求转发:利用RequestDispather接口中的forward方法实现请求转发。
请求重定向:利用HttpServletResponse的sendRedirect方法实现请求重定向。
1.请求的转发:地址栏是初次发出请求的地址。
请求的重定向:地址栏不是初次发出请求的地址,为最后响应的地址。
2.请求转发:在最终的Servlet中,request和中转的那个request是同一个对象。
请求的重定向:在最终的Servlet中,request和中转的那个request不是同一个对象。
3.请求转发:只能转发给当前web应用的资源。
请求的重定向:可以重定向到任何资源。
4.请求的转发:/代表的是当前web应用的根目录。
请求的重定向:/代表的是当前web站点的根目录。
session机制
session存储在服务端
Cookie(“JSESSIONID”,“ID值”)
客户端第一次请求服务器时,(JSESSIONID-sessionId匹配失败)服务端会产生一个session对象(用于保存该客户的信息),并且每个session对象,都会有一个唯一的sessiId(用于区分其他session);服务端会产生一个cookie,还包含一个key-value对,name=JSESSIONID,value = 服务端sessionId,然后服务端会在响应客户端的同时,将该cookie发送给客户端。客户端就有了cookie(JSESSIONID)。(JSESSION-cookieId对应)。
第二次/第n次请求服务器时,服务端会先用客户端的cookie中的JSESSIONID,去匹配服务端的sessionid.
session在同一个客户请求时共享
session方法
String getId():获取sessionId
boolean isNew():判断是否是新用户(第一次访问)
void invalidate():使session失效 (退出登录,注销时)
void removeAttribute() 加入参数,使部分失效
void setAttribute()
Object getAttribute()
void setMaxInactiveInterval(秒)设置最大有效 非活动时间
request:数据在同一次请求中有效(不同浏览器中不行)
session和cookie比较
session(HttpSession) | cookie | |
保存的位置 | 服务端(安全) | 客户端(不安全) |
保存的内容 | Object | String |
JDBC API三大功能。
主要通过以下类/接口来实现
DriverManger :管理驱动
Connect:连接(通过DriverManger获得)
作用:
产生操作数据库的对象
产生Statement对象——creatstatement()
产生PreparedStatement对象——prepareStatement()
产生CallableStatement对象——prepareCall()
Statement(PreparedStatement是Statement的接口):增删改查(通过Connect的对象产生)
Statement作用:操作数据库
增删改:executeUpdate()
查询:executeQuery()
PreparedStatement(推荐)
作用:操作数据库
增删改:executeUpdate()
查询:executeQuery()
赋值操作 setXxx()
优点
1 编码更加简洁
2 提高性能(预编译)
3 安全 防止sql注入攻击(将客户注入内容与开发人员的sql语句混为一体)
--是sql的注释语句
CallableStatement:调用数据库中的 存储过程/存储函数(通过Connect的对象产生)
connect对象.prepareCall(存储过程或存储函数名)函数产生
存储过程(无返回值return,用out参数代替):{ call 存储过程名(参数列表)}
存储函数(有返回值):{ ?= call 存储函数名(参数列表)}
Result:返回结果集(通过Statement等产生)
作用:保存结果集 select * from xxx
next():当前数据下一个是否还有数据:返回值 true/false
previous()当前数据上一个是否还有数据:返回值 true/false
2 jdbc访问数据库的具体步骤
a 导入驱动,加载具体的驱动类
b 建立连接
c 发送sql
d 处理结果集
数据库驱动 驱动.jar
Oreacle ojdbc-x.jar
Mysql mysql-connector-java-x.jar
Sqlserver sqljdbc-x.jar
3 处理CLOB/BLOB类型
mysql:text
处理稍大型数据
a.将存储路径放入数据库,通过JDBC存储文件路径,然后根据IO操作处理。
b
CLOB:大文本数据(小说)
存
1 先通过psmt的?(占位符)代替小说内容
2再通过pstmt.setCharacterStream(2,reader,(infile.length());将上一步的占位符替换为小说流,注入
取
1通过Reader reader = rs。getCharacterStream(“NOVEL”);将cloc的数据,保存到Reader对象中
2将Reader通过Writer输出即可。
BLOB:二进制 字节流 InputStream OutputStream,与CLOB步骤基本一致,区别(创建方式不一样):setBinaryStream(。。。) getBinaryStream(。。。)
4 JAVABean
作用
减轻JSP的复杂度
提高代码复用率
定义:就是java类,满足以下两点
1 public修饰的类,无参构造
2 所有属性都是private,并且提供set/get方法 (如果是布尔类型,set改为is)
使用层面 java分为两大类(类似结构体)
1个封装业务逻辑(登录逻辑)可以将jsp中的jdbc代码,封装到login.java类中(login.java)
2个封装数据(实体类,Student.java,Person.java) 相当于数据库的一张表
封装业务逻辑用 于操作一个 封装数据
MVC设计模式
M:model 一个功能 javabean来实现
V:view 展示以及与用户交互 技术html,css,js,jsp
C:controller 接受请求,跳转到model进行处理,再将处理的结果返回给请求界面。建议用servet实现
jsp>java(servet)>jsp
servet :
java类必须符合一定的规范
a 必须继承 javax.ser.httpservlet
b 重写其中的doget()或dopot()方法
doget():接受 所有get()请求
dopost():接受 所有post()请求
servlet使用前需要配置web.xml,映射关系 servlet-mapping拦截,通过servlet中name匹配,执行class
或者@servlet(3.0)注解方式进行配置
匹配流程:请求地址与@servlet的值进行匹配
servlet生命周期五个阶段
加载卸载:servlet容器自动处理
加载
初始化 init()方法,servlet被加载并实例化以后执行,可以修改为tomcat启动时执行(servlet2. 5时,web.xml里面改:
<servlet>
<load-on-startup>1</load-on-startup>
</servlet>
servlet3.0方式,写在注解里
1代表第一个servlet启动时执行顺序
服务 service()方法,可以重写doget(),dopost()方法进行具体实现
销毁destroy(),servlet被系统回收时执行
卸载
5 Servlet API:由两个软件包组成,对应于http协议的软件包,和除了http协议以外的其他软件包,即Servlet API可以适用于任何通信协议。
javax.servlet.http包中的类和接口,继承自http
6 Servlet 继承关系
ServletConfig 接口
ServletContext getServletContext():获取Servlet上下文对象 application
String getInitParameter(String name):在当前Servlet范围内,获取名为name的参数值
Servlet2.5在xml文件中配置
Servlet3.0 在注解里配置,只属于此Servlet,无法配全局参数
HttpServlet Request的方法,同request方法一致
a 三层架构
与mvc设计模式的目标一致,都是为了解耦合,提高代码复用率区别在于两者对项目的理解不同
b 三层组成
表示层 (USL user show layer)view,视图层
-前台:对应于MVC中的View,用于和用户交互,界面的展示
jsp,js,html,css,jquery等web前端技术
代码位置:webContent
-后台:对应于MVC中的Controller,用于控制跳转,调用业务逻辑层
Servlet (springMVC Struts2),位于xxx。servlet包中
业务逻辑层 (bll ,Business Logic Layer)service层
-接受表示层的请求,调用
-组装数据访问层,逻辑性的操作(增删改查)
一般位于 xxx.service包中(也可以成为:xxx.manager,xx.bll)
数据访问层(DAL,Data Access Layer)dao层
-直接访问数据库的操作,原子性的操作(增删改查)
-一般位于 xxx.dao包中
在servlet中获取out对象:通过PrintWriter out = response.getWriter()
在servlet中获取session对象:requster.getSession()
在servlet中获取application对象:reque.getServletContext()
响应的编码设置需要在响应对象创建之前创立
三层优化
1 加入接口 建议面向接口开发:先接口-在实现类
——service,dao加入接口
——接口与实现类的命名规范:接口:interface 起名实现 IXxxService,IXxxDao。实现类implements,起名 XxxDaoImpl, XxxServiceImpl
——实现接口/实现类时,推荐写法:接口 x = new 实现类();
2 DBUtil 通用数据库帮助类,简化Dao层的代码量
index.jsp ->index_jsp.java->index_jsp.class JSP翻译成的java以及编译后的class文件 存在于tomcat的work目录中
web调试 与java代码调试的区别:启动方式不同 web要用debug
来源:oschina
链接:https://my.oschina.net/u/4310326/blog/4659430