JSP
JAVABEAN
1. 概念:javaBean是一个纯java代码,又叫pojo。在MVC模式中是model,他主要是封装数据和业务逻辑。
2. 种类:
① 数据Bean【优点:利用框架技术完成自动收集】
l 表单Bean:作用封装表单中的参数
语法要求属性、名字、个数、类型与表单中参数一致
l 结果Bean:作用封装数据库中的记录
语法要求属性、名字、个数、类型与表中记录字段一致
② 业务逻辑Bean【优点:复用、分布】
l 业务Bean:作用对用户请求进行处理
l 持久Bean:作用封装对数据库的操作(DAO层数据访问层)
【数据:在表单中称为参数、在JavaBean中称为属性、在数据库中字段】
表单Bean
1. 语法
① 包声明
l 作用:体现了JavaWeb分包管理的原则
② 有public修饰的类,且类名和文件名相同
l 多个单词首字母大写、一个小写
③ 属性的名字、个数、类型必须和参数一致,且所有属性必须隐藏private
l 若属性不是private修饰,则会造成数据混乱
④ 提供公有的get和set方法访问属性
⑤ 必须显示提供无参的构造方法
l 作用:便于维护
l 若对外不提供,则加private。
l 如果没有指定构造方法,则会自动生成一无参的什么都不做的构造方法
2. 部署
把.class字节码文件放到WEB-INF/classes/下与包对应的目录结构中
作用:WEB-INF的classes用来放字节码文件以便让Tomcat找到
3. WEB-INF结构
① classes:储存会用到的java类别
② lib:储存Web程序会用到的第三方jar文件
③ web.xml:此文件为网站结构不输描述符,记载每个网站程序的设定。
4. 通过Servlet调用表单Bean
浅:jsp视图组件显示结果
深:从内置对象拿到数据处理response,在浏览器看到结果。
5.流程:最先经过的组件为Servlet,最后jsp视图组件。其中jsp中一定要有page,防止编码错误。
标签
1.
<%@pageimport="cn.zte.pxb.*"%>
l 包导入作用:为了在指定的位置将字节码文件加载在方法区。
2. 实例对象:SimpleBean zs = new SimpleBean();
l zs:对象的地址、引用、句柄、值。在栈中开辟空间
l 实例方法自带this指针而静态方法不带this指针。
l 创建对象至少调用一个构造方法。
3. 用标签代替一行或多行java代码,属于java语法范畴,必须有无参构造方法。但标签和EL表达式只能用于jsp。
①<jsp:useBean id="zs"scope="page" class="cn.zte.pxb.SimpleBean"/>代替
if(page.getAttribute("zs")==null)
page.setAttribute("zs",newSimpleBean());
SimpleBeanzs=(SimpleBean)page.getAttribute("zs");
l id=“zs" 表示实例化对象的名称。scope="page"表示使用范围 。class="cn.zte.pxb.SimpleBean"/>对象所属的包.类名称路径。
②<jsp:setPropertyname="zs" property="*"/>代替
zs.setName("tom");zs.setPassword("123456") ;
<jsp:getProperty name="zs"property="name"/>代替
<%=zs.getName()%>等价于${zs.name}
<jsp:getProperty name="zs"property="password"/>代替
<%=zs.getPassword()%>等价于{zs.password}
l name:已经声明过的JavaBean对象的(id)。property:表示要设置的属性,如果为“*”,则表示自动匹配
l 收集可以property="*",而输出要一个一个。
l 表单自动收集,找对象顺序page→request→session→application。
l 在合法状态下,能自动转换不同的类型。
4. page在访问jsp时就创建。在类中找zs内置对象,若无,则创建。
标签和表单
1.
当表单中没有输入值时,标签通过getProperty拿属性为0,request通过getParameter拿参数为null。
2. request表单参数个数大于或小于标签getProperty表单Bean个数时,标签Bean都去request表单中找,找到则设值,找不到就默认。
前提:不管参数类型、个数是否一样,必须保证参数名字对应一样。
3. 给某个属性赋值的三种方法
① <jsp:setProperty name="ls" property="password"/>
拿到SimpleBean对象给SimpleBean的name赋值,值为request表单中的password(表单中指定的参数值)
② <jsp:setPropertyname="ls" property="name"value="password"/>
将SimpleBean的name值设为字符串“password”(直接设值)
③ <jsp:setProperty name="ls"property="age"value="21"/>
直接给SimpleBean的属性赋值,必须写字符串
表单Bean在内置对象中的传递
1. 内置对象
① page访问jsp时创建
② request发请求时创建,请求结束时销毁。生命周期服务器决定-请求范围
③ sesstion用户不下线即有效。生命周期客户端决定-用户范围
④ appliction服务器启动时创建
2. page
因为会产生两个CoutBean。所以可得:
page不能将表单Bean从一个页面传到另一个页面,也不能将表单Bean从一个组件传到另一个组件。只在页面有效,离开页面无效。
3. request
由于request在用户请求未结束,则不会失效。服务器会产生一个CoutBean。所以可得:
l 在服务端跳转时(<jsp:forwardpage="requestJBDemo02.jsp"/>),可以传递。
l 在客户端跳转时(<ahref="requestJBDemo02.jsp">requestJBDemo02.jsp</a>),相当于重新发请求,不可以传递。
4. session
因为会产生一个CoutBean。所以可得
服务端、客户端跳转时,都可以传递。造成服务器效率下降,所以只传验证信息。
5. application
6. Jsp标签使用场合、缺点
① 使用场合:用于小型项目中,不能用于MVC模式。
② 缺点:
l 不符合MVC设计模式
l 功能有限,胜任不了大项目
l 容错能力差
7. 导入jar包才能使用jstl标签
Servlet
1. 概念:用java代码编写的,线程安全的web组件,再MVC设计模式起到C(控制层作用:对请求的分发、完成向视图组件的转向)。
2. 线程安全:对象属性的值/对象的状态不能被其他线程改变。
3. MVC:功能单一、目标明确
4. 作用
① CGI:通用网关接口,从服务器中取得内置对象的能力。
l 取:取内置对象在堆中的空间地址。
l 两种方式取得内置对象:注入、依赖查找。
注入:调用对象方法直接给数据,立马给内置对象。
依赖查找:在对象上查找。
l CGI用注入方式
② 创建表单Bean,收集表单数据
③ 对请求分析并分发给业务层,包括表单Bean、内置对象
④ 根据业务层的转向信息,转至视图组件显示
5. 流程
启动服务器,用户通过浏览器表单发送请求给服务器,创建request获取参数,通过配置信息,将请求给Servlet,注入内置对象。Servlet创建表单Bean,封装请求参数,对请求分析交给业务层。业务层将表单中参数交给持久层。持久层根据所得用户参数访问数据库,创建结果Bean,封装结果Bean,将结果Bean返回给业务层。业务层将其放入request中,向Servlet发转向信息。在request中取得数据后将静态代码、动态结果交给response后在浏览器上显示。
6. DAL(持久层)作用:接受表单参数、访问数据库、创建结果Bean,封装结果数据、将结果Bean给业务层。
7. JSP作用:取得结果Bean、对结果Bean进行处理、将处理结果交给response,后在浏览器上显示。
8. Servlet语法
① 包声明【体现分包管理原则】
② 包导入【在指定包下找到指定的类】
l import java.io.* ;IOException属于java.io包下
l import javax.servlet.* ;ServletException属于javax.servlet包下
l import javax.servlet.http.* ;HttpServlet、HttpServletRequest、HttpServletResponse存放在javax.servlet.http包下
③ 类定义
l publicclass SimpleServlet extends HttpServlet
l 继承:私有方法、构造方法、属性这三个不能被继承。抽象类可以被继承,不能创建对象。创建子类对象不能创建父类对象,创建子类对象调用父类构造方法为继承属性初始化。
④ 方法定义
l public void doGet(HttpServletRequestreq,HttpServletResponse resp) throws IOException,ServletException
l public void doPost(HttpServletRequestreq,HttpServletResponse resp) throws IOException,ServletException
l throws声明异常、不处理异常,在方法声明后,throw抛出异常,在方法体内部。
9. 部署
J2SE识别不了J2EE的扩展包,而javac编译在J2SE中,即javac不能编译J2EE
解决办法:找到J2EE的扩展包(Tomcat→common→lib→servlet.api)放到jdk→jre→lib→ext
10. 配置
l servlet-name内部名、cn.soft.tyh.SimpleServlet包名+类名、servlet-class包所在的目录结构、url-pattern隐射名
l servlet-mapping删除后,不接受用户请求、再删除load-on-startup则不创建Servlet对象
11. system.out流对象jdk创建,往服务器显示、out外部对象Tomcat创建,往浏览器显示。
Servlet生命周期
1. Tomcat一启动就将response、request、config注入
2. publicvoid init(ServletConfig config) throws ServletException//初始化,Tomcat启动后,配置xml中创建对象就调用init
3. 有参数的init是为了拿到config。当有参无参init都存在,调用有参。
4. destroy()//销毁,服务器关闭Servlet销毁后,释放Servlet所占资源,需调用destory
5. 生命周期
① 若配置了load-on-startup,则会创建Servlet对象。若没配,第一次访问时创建
② 执行init,默认执行有参,即注入config。若想调用无参,则不写有参。
③ 等待服务,一个Servlet同时为多个客户服务(时间片轮转、并发单服务器),必须线程安全。
④ 若表单发请求,Tomcat调用Servlet的doPost注入response、request给业务层。
⑤ 销毁及移除内存
6. 若想在destory方法中获得out对象,则用实例全局变量,通过doGet中response得到。方法之间传递对象,用实例全局变量。
7. 为什么要获取servlet初始化参数?拥抱需求。当数据库改变时,只需要更改配置。
8. <web-appxmlns="约束规定语法顺序(如Servlet和Servelt-mapping的顺序)">
9. 流程:Tomcat启动,创建config,在web.xml找Servlet标签中init标签,将参数封装在config中。创建Servlet对象,调用init,将config封装的属性、方法注入,取得初始化参数。
10. 从config中获取初始化参数
① this.username=config.getInitParamter(“username”);对象里的属性在堆里开辟数据
② String dd=config.getInitParamter(“DBDRIVER”);在栈里开辟数据
③ 方法调用结束,对象在,方法中变量不在。this.username、this.password在,dd不在。所以要用实例全局变量。
11. username、password别的线程不能更改,设置时只在init中,所以安全。
12. 实例全局变量定义在类中,并用private隐藏,该类内部可调用,外部无法访问。
表单访问Servelt
1. 利用servlet取得session地址
HttpSession session =req.getSession() ;
session.setAttribute("sname",name);
2. 利用servlet取得application
方法一:ServletContext app=req.getSession().getServletContext();
app.setAttribute("addr","www.zte.cn");
方法二:有config ServletContext app=this.config.getServletContext();
无config ServletContextapp=this. getServletContext();(如果有带参init获得config不能用)
EL表达式
1. 概念:工作再jsp页面中取得内置对象属性值参与表达式计算
2. 工作环境:工作中唉jsp1.2或jsp2.0以上的版本
3. 基本语法:${属性名}
4.
5. 优点
① 语法简单
② 用“”代替null,避免空指针异常
l 若无sname属性值,则输出空串。jsp不支持会原封不动输出,解决办法:加入<%@ page isELIgnored="false"%>则支持
l 若${name.age}中无name,则不会运行到age
③ 转换
④ 表达式运算
第一个:“30”*5+null+6→30*5+0+6=156
第二个:“30”>5→30>5→true
6. EL表达式顺序
page→request→session→application,其中找到一个就不找了,若一个都没有则空串
7. 如果在不同的属性范围中设置了同一个属性名称,则之后的同名的属性无法找到,则从指定的内置对象中取得数据采用隐式对象
由于EL表达式顺序,获取的${name}的值为page的name。此时想获取request中name。
解决方法:引用隐式对象${requestScope.name}
8. EL表达式在MVC中应用
视图组件拿到属性,用EL表达式在浏览器上显示。
Fileter
1. 概念:用java编写的线程安全的Web组件,主要完成请求拦截和结果拦截。
2. 原理
3. 功能
① 编码拦截
属于请求拦截,拿到所有用户所有请求的request,给所有request进行编码。request.setCharacterEncoding(“GBK”);
② 请求验证拦截
③ 非法文字拦截
④ lazy懒加载拦截
每个请求有一个session,将其绑定在线程上,使原本线程不安全的session,绑定后安全。
⑤ struct2中起中央控制器作用
4. 类继承一个父类与类实现一个接口的区别
① 抽象类能声明不能实现,抽象类有构造方法能被继承。创建子类对象不能创建出父类对象,但会调用父类的构造方法,给继承父类的属性初始化
② 属性的规定public final static,接口用interface定义,无构造方法,接口方法都是abstract类可以实现多个没有关系的接口,一个接口可以被多个无关类实现
③ 接口不是特殊的抽象类
5. 语法
① 包声明
② 包导入
l import java.io.*;
l import javax.servlet.*;//导入ServletRequest、ServletResponse、FilterChain、Filter、FilterConfig、ServletException
l import javax.servlet.http.*;//导入HttpServletRequest、HttpServletResponse
③ 类定义
public class CharsetEncodingFilterimplements Filter
④ 方法定义
l public void init(FilterConfig config)throws ServletException
对象创建就调用,只有一个有参的,调用后马上注入config,变量类型filterconfig。
Tomcat启动,创建两个config。一个实现servletconfig,读取servlet的page信息初始化参数给servlet的init。一个实现filterconfig,自动从filter组件中读取给filter的init
l public void doFilter(ServletRequestservletRequest, ServletResponse servletResponse,FilterChain chain) throwsIOException, ServletException
请求给过滤器,调用dofilter方法拦截请求,所以请求被拦截时调用,注入对象request、response、chain
l public void destroy()
销毁filter,释放资源。服务器关闭,调用destory。
不可以不写,因为三个方法都是filter接口中方法,必须重写实现,否则不能创建。
6. 部署
7. 配置
8. 拦截器的应用
① 编码拦截器
Tomcat启动,实现Servletconfig接口,读取servelt的page信息初始化参数,读取web.xml,取filter初始化参数到filterconfig,init注入config,取page信息初始化参数。
② 请求验证拦截器
假设拦截的是*.jsp组件。假如表单为index.jsp或regist.jsp,则拦截之后,先验证看是否注册或登录的组件,则不验证,直接请求下传。
③ 非法文字拦截器
④ 懒加载拦截器
Listener监听器
1. 概念:java编写的web组件,主要完成对内置对象的状态变化和属性的变化做监听,进行进一步的处理
2. 作用
① 对application状态变化和属性变化做监听
② 对session状态变化和属性变化做监听
3. 原理
4. 语法
① 包声明
② 包导入
l import javax.servlet.http.* ;
③ 类定义
l public class HttpSessionDemo implementsHttpSessionListener,HttpSessionAttributeListener
④ 方法定义
l 添加public void attributeAdded
getServletContext().setAttribute(“username”,”zs”);
l 替换public void attributeReplaced
同名异值替换getServletContext().setAttribute(“username”,”ls”);
后台获取的属性值是替换前的
前台获取的属性值是替换前的
再次同名同值替换getServletContext().setAttribute(“username”,”ls”);
后台获取的属性值是替换前的
前台获取的属性值是替换前的
l 删除public void attributeAdded
删除属性getServletContext().removeAttribute(“username”,”ls”);
后台获取的属性值是移除前即被移除的
前台获取的属性值是null
5. 配置
6. 为什么类对象能对application创建进行监听?实现了ServletContextListener接口
7. 怎么证明对application进行了监听?this.application.getRealPath
8. 因为对application和session监听,application在Tomcat启动时创建。所以listener在Tomcat启动时创建。listener→application→serveltconfig、filterconfig→filter→servlet
9. 初始化参数分两种
① 封装到application的全局变量所有都可以用
<context-param>
<param-name>
<param-value>
② 局部变量<init-param>
10. Session什么时候创建
不访问不创建
用户第一次访问服务器没有创建→第一次访问项目没有创建→第一次访问静态web组件html没有创建→第一次访问动态web组件jsp创建
11. Session什么时候销毁
浏览器关闭session没有销毁。为了避免这种情况,保证关浏览器,session销毁,则用javascript处理。
JDBC
1. 概念:java连接数据库技术,它是连接数据库的标准,它包括连接数据库的一套API(类和接口),它主要应用于持久层DAO中完成对数据库的操作
2. 数据存取方式:往文件存取、往数据库存取
3. 数据库连接方式:ODBC、JDBC
4. jdbc连接数据库方式
① ODBC-JDBC桥
将java代码转换成ODCA能接受的代码
② 直连
5. jdbc访问数据库的步骤(ODBC-JDBC桥)
① 导入java.sql.*包
② 加载驱动Class.forName(DBDRIVER) ;
通过驱动程序名在指定位置找到驱动程序加载到内存
③ 创建连接conn = DriverManager.getConnection(DBURL) ;
链接名=数据库连接协议+数据源
④ 创建操作stmt.executeUpdate(sql) ;或stmt.createStatement (sql) ;
⑤ 关闭操作stmt.close() ;
⑥ 关闭连接conn.close() ;
6. 访问数据库(直连)
oracle为java提供驱动程序