回顾: xml: 可扩展的标签语言 标签可以自定义 作用:配置文件 xml组成: 声明 首行顶格写 元素 <xxx></xxx> <xx/> 属性 <xxx attr="value"> 注释 <!--注释内容--> CDATA 原样输出 <![CDATA[ .... ]]> xml的解析: sax:逐行解析,只能查询 dom:一次性将文档加载到内存,形成一棵树,可以进行curd操作 通过dom4j进行查询操作: 1.导入jar包 2.获取document Document doc = new SAXReader().read(文件路径); 3.获取根节点 Element root = doc.getRootElement(); 4.获取其他节点 获取属性节点 String value = root.attributeValue("属性名") 获取所有的子元素 List<Element> list=root.elements() 获取子元素的文本节点 String text=ele.elementText("子元素名称") 扩展:xpath api: List<Element> selectNodes("表达式"); Element selectSingleNode("表达式"); /////////////////////////////// xml约束: 作用:规定文档中可以出现那些元素和属性 及他们出现的顺序 分类: DTD和SCHEMA DTD:一个xml文档中只能有一个dtd约束 只要在文档上面看到<!DOCTYPE> 就说明使用的是dtd约束 * ? + , | () SCHEMA:一个xml文档中可以出现多个schema约束 只要在xml文档中看到 xmlns ////////////////////// tomcat web:网页或者资源 资源有动态web资源和静态web资源 动态的web开发技术:servlet和jsp 等等 静态的web开发技术:html css等 tomcat 启动: bin/startup.bat 退出: bin/shutdown.bat 修改端口号: conf/server.xml 存放项目目录:webapps web项目目录 myweb | |--- html css 图片 | |--- WEB-INF(特点:浏览器直接访问不到,通过java程序可以) | | | |--- lib | |--- classes | |--- web.xml(核心配置文件) | | ////////////////////////////// 发布方式: 方式1:将项目放在webapps下 /////////////// 访问路径: http://主机:端口号/项目名称/资源路径 ////////////////////////// ///////////////////////////////////////////////// http:要求:掌握一些头信息 超文本传输协议: 规定数据的格式 浏览器往服务器发送 ---- 请求 服务器往浏览器回写 ---- 响应 请求:(request) 组成部分: 请求行 请求头 请求体 请求行:请求信息的第一行 格式:请求方式 访问的资源 协议/版本 例如:GET /day0801/1.html HTTP/1.1 请求方式:get和post get会把参数放在url的后面 post不会 get参数大小有限制,post请求却没有限制 get请求没有请求体;post请求有请求体 请求参数放在请求体中 请求头:请求信息的第二行到空行结束 格式:key/value (value可以是多个值) 常见的请求头: Accept: text/html,image/bmp --支持数据类型 text/html text/css text/javascript 大类型/小类型 mime类型 Accept-Charset: ISO-8859-1 --字符集 Accept-Encoding: gzip --支持压缩 Accept-Language:zh-cn --语言环境 Host: www.itcast.cn:80 --访问主机 If-Modified-Since: Tue, 11 Jul 2000 18:23:51 GMT --缓存文件的最后修改时间 Referer: http://www.itcast.com/index.jsp --来自哪个页面、防盗链 User-Agent: Mozilla/4.0 (compatible; MSIE 5.5; Windows NT 5.0) Cookie Connection:Keep-Alive --链接状态 掌握的头信息: Referer User-Agent Cookie If-Modified-Since 请求体:空行以下的内容 只有post才有请求体 get请求参数 http://xxxx?username=tom&password=123 格式:username=tom&password=123 //////////////////// 响应:(response) 组成部分: 响应行 响应头 响应体 响应行:响应信息的第一行 格式:协议/版本 状态码 状态码说明 例如:HTTP/1.1 200 OK 状态码: 200 正常响应成功 302 重定向 304 读缓存 404 用户操作资源不存在 500 服务器内部异常 响应头:从响应信息的第二行到空行结束 格式:key/value(value可以是多个值) 常见的头 Location: http://www.it315.org/index.jsp --跳转方向 和302一起使用的 Server:apache tomcat --服务器型号 Content-Encoding: gzip --数据压缩 Content-Length: 80 --数据长度 Content-Language: zh-cn --语言环境 Content-Type: text/html; charset=GB2312 --数据类型 Last-Modified: Tue, 11 Jul 2000 18:23:51 GMT --最后修改时间 Refresh: 1;url=http://www.it315.org --定时刷新 Content-Disposition: attachment; filename=aaa.zip --下载 Set-Cookie:SS=Q0=5Lb_nQ; path=/search Expires: -1 --缓存 Cache-Control: no-cache --缓存 Pragma: no-cache --缓存 Connection: Keep-Alive --连接 掌握的头信息 Content-Type Location Last-Modified Refresh Content-Disposition Set-Cookie 响应体:空行以下的内容 页面上展示的内容 ////////////////////////// 案例1-完成登录案例. 需求: 在页面上输入用户名和密码,提交到服务器上,服务器拿着用户名和密码去数据库中查找有无此用户 若有用户,则提示登录成功 若无此用户,则提示用户名密码不匹配 技术分析: 表单 servlet 请求(request) 响应(response) //////////////////////////////////// 表单: 收集用户数据 所有的字段要想提交到服务器必须 有name属性 提交的地址 action 请求方式:post ////////////////////////////////////// servlet: 动态的web开发技术,本质就是一个类,运行在服务器端的一个java小程序 处理业务逻辑,生成动态web内容 编写一个servlet步骤: 1.编写一个类 a.继承HttpServlet b.重写doGet或者doPost方法 2.编写配置文件(web-inf/web.xml) a.注册servlet b.绑定路径 3.访问 http://主机:端口号/项目名/路径 接受参数: 格式:key=value Sting value=request.getParameter("key") 例如: http://localhost/day09/hello?username=tom request.getParameter("username")就可以获取tom值 回写内容: response response.getWriter().print("success"); 处理响应数据中文乱码: resp.setContentType("text/html;charset=utf-8"); //建议大家放在方法中的第一行 '///////////////////////////////////////////' 步骤分析: 1.先有数据库和表 create database day09; use day09; create table user( id int primary key auto_increment, username varchar(20), password varchar(20), email varchar(20), name varchar(20), sex varchar(10), birthday date, hobby varchar(50) ); insert into user values (null,'tom','123','tom@126.com','tom','1','1988-01-01',null); 2.创建工程 3.复制页面 修改login.html 给用户名和密码添加name属性 修改表单的action属性 action="http://localhost/day0901/login" 添加method属性 method="post" 4.导入jar包: 驱动 dbutils c3p0 5.导入工具类和配置文件 datasourceUtils c3p0-config.xml(注意修改数据名称) 6.创建servlet(LoginServlet: 路径 /login) 接受用户名和密码 调用service层(UserService)完成登录操作 提示信息 7.UserService login(username,password) 调用dao 8.dao 通过用户名和密码查询数据库 ////////////////////////// serlvet总结: servlet的体系结构:(了解) Servlet:接口 | GenericServlet:抽象类 | HttpServlet:抽象类 | 自定义servlet servlet常用方法: void init(ServletConfig config):初始化 void service(ServletRequest request,ServletResponse response):服务 处理业务逻辑 void destroy():销毁 ServletConfig getServletConfig() :获取当前servlet的配置对象 GenericServlet常用方法: 除了service方法没有显示,其他都实现了 空参的Init() 若我们自己想对servlet进行初始化操作,重写这个init()方法即可 HttpServlet常用方法: service做了实现,把参数强转,调用了重载的service方法 重载的service方法获取请求的方式,根据请求方式的不同调用相应doXxx()方法 doGet和doPost方法 //////////////////////////////// servlet生命周期 ★★★ void init(ServletConfig config):初始化 * 初始化方法 * 执行者:服务器 * 执行次数:一次 * 执行时机:默认第一次访问的时候 void service(ServletRequest request,ServletResponse response):服务 处理业务逻辑 * 服务 * 执行者:服务器 * 执行次数:请求一次执行一次 * 执行时机:请求来的时候 void destroy():销毁 * 销毁 * 执行者:服务器 * 执行次数:只执行一次 * 执行时机:当servlet被移除的时候或者服务器正常关闭的时候 serlvet是单实例多线程 默认第一次访问的时候,服务器创建servlet,并调用init实现初始化操作.并调用一次service方法 每当请求来的时候,服务器创建一个线程,调用service方法执行自己的业务逻辑 当serlvet被移除的时候服务器正常关闭的时候,服务器调用servlet的destroy方法实现销毁操作. ///////////////////////////// url-pattern的配置:★ 方式1:完全匹配 必须以"/"开始 例如: /hello /a/b/c 方式2:目录匹配 必须"/"开始 以"*"结束 例如: /a/* /* 方式3:后缀名匹配 以"*"开始 以字符结尾 例如: *.jsp *.do *.action 优先级: 完全匹配>目录匹配>后缀名匹配 练习: 有如下的一些映射关系: Servlet1 映射到 /abc/* Servlet2 映射到 /* Servlet3 映射到 /abc Servlet4 映射到 *.do 问题: 当请求URL为“/abc/a.html”,“/abc/*”和“/*”都匹配,哪个servlet响应 Servlet引擎将调用Servlet1。 当请求URL为“/abc”时,“/*”和“/abc”都匹配,哪个servlet响应 Servlet引擎将调用Servlet3。 当请求URL为“/abc/a.do”时,“/abc/*”和“*.do”都匹配,哪个servlet响应 Servlet引擎将调用Servlet1。 当请求URL为“/a.do”时,“/*”和“*.do”都匹配,哪个servlet响应 Servlet引擎将调用Servlet2. 当请求URL为“/xxx/yyy/a.do”时,“/*”和“*.do”都匹配,哪个servlet响应 Servlet引擎将调用Servlet2。 //////////////////// 在servlet标签有一个子标签 load-on-startup 作用:用来修改servlet的初始化时机 取值:正整数 值越大优先级越低 /////////////////////// 当我们的配置文件里面没有指定配置的话,会查找tomcat的web.xml, 若请求我们自己的项目处理不了,tomcat的默认的servlet会帮我们处理信息 /////////////////////////////////////// 路径的写法: 相对路径: 当前路径 ./ 或者 什么都不写 上一级路径 ../ 绝对路径:(我们使用) 带主机和协议的绝对路径(访问站外资源) http://www.itheima.com/xxxx http://localhost:80/day09/hello 不带主机和协议的绝对路径 /day09/hello(经常使用) ///////////////////////////// 案例2-当我们登录失败,提示"用户名密码不匹配",3秒以后跳转到登录页面 技术分析: 定时刷新 常见的响应头-refresh 响应头格式: refresh:秒数;url=跳转的路径 设置响应头: response.setHeader(String key,String value);设置字符串形式的响应头 response.addHeader(String key,String value);追加响应头, 若之前设置设置过这个头,则追加;若没有设置过,则设置 设置定时刷新: response.setHeader("refresh","3;url=/day0901/login.htm"); 步骤分析: 登录失败之后,修改业务逻辑 打印之后添加一个头信息即可 /////////////////////////// 案例3-统计登录成功的总人次, 需求: 在一个用户登录成功之后,获取之前登录成功总人次,将次数+1.在访问另一个servlet的时候,显示登录成功的总人次 技术分析: ServletContext /////////////////////// ServletContext: 上下文(全局管理者) 常用的方法: setAttribute(String key,Object value);//设置值 Object getAttribute(String key);//获取值 removeAttribute(String key)://移除值 获取全局管理者: getServletContext(): ///////////////////////////////// 步骤分析: 1.在项目启动的时候,初始化登录次数 在loginservlet的init()方法中获取全局管理者,将值初始化为0,放入servletcontext上 2.登录成功之后,在loginservlet中获取全局管理者,获取登录成功的总次数 3.然后将次数+1,让后将值设置回去 4.当访问showServlet的时候,获取全局管理者,获取登录成功的总次数,然后在页面上打印出来即可 /////////////////////////// ServletConfig:(了解) servlet配置对象 作用: 1.获取当前servlet的名称 2.获取当前servlet的初始化参数 3.获取全局管理者 方法: String getServletName():获取当前servlet的名称(web.xml配置的servlet-name) String getInitParameter(String key):通过名称获取指定的参数值 Enumeration getInitParameterNames() :获取所有的参数名称 初始化参数是放在 web.xml文件 servlet标签下子标签 init-param ★getServletContext():获取全局管理者 servletconfig是由服务器创建的,在创建servlet的同时也创建了它,通过servlet的init(ServletConfig config)将config对象 传递给servlet,由servlet的getServletConfig方法获取 //////////////////////// ServletContext:理解 上下文(全局管理者) 一个项目的引用.代表了当前项目. 当项目启动的时候,服务器为每一个web项目创建一个servletcontext对象. 当项目被移除的时候或者服务器关闭的时候servletcontext销毁 作用: 1.获取全局的初始化参数 2.共享资源(xxxAttribute) 3.获取文件资源 4.其他操作 获取servletcontext: 方式1:了解 getServletConfig().getServletContext() 方式2: getServletContext() 常用方法: 1.了解 String getInitParameter(String key):通过名称获取指定的参数值 Enumeration getInitParameterNames() :获取所有的参数名称 在根标签下有一个 context-param子标签 用来存放初始化参数 <context-param> <param-name>encoding</param-name> <param-value>utf-8</param-value> </context-param> 2.xxxAttribute 3. String getRealPath(String path):获取文件部署到tomcat上的真实路径(带tomcat路径) getRealPath("/"):D:javaToolsapache-tomcat-7.0.52webappsday09 InputStream getResourceAsStream(String path):以流的形式返回一个文件 4.获取文件的mime类型 大类型/小类型 String getMimeType(String 文件名称) ////////////////////////////////////////// 域对象:★★★ servletcontext 当成map集合 常用方法: xxxAttribute() servletcontext创建和销毁: 当项目启动的时候,服务器为每一个web项目创建一个servletcontext对象. 当项目被移除的时候或者服务器关闭的时候servletcontext销毁 存放: 共享的数据 //////////////////////// //////////////////////// //////////////////////// //////////////////////// 获取文件的路径: 通过类加载器获取文件:2.txt 放在classes目录下无论是java项目还是web项目都可以 类.class.getClassLoader().getResource("2.txt").getPath() //////////////////////////////////////////////////////// //////////////////////////////////////////////////////// //////////////////////////////////////////////////////// 上午回顾: http:超文本传输协议 请求: 响应: servlet:★ 本质上就是一个类,运行在服务器端的一个java小程序,生成动态web内容处理业务逻辑. 编写servlet: 1.编写一个类 继承了HttpServlet 重写了doGet()或者doPost() 2.编写配置文件 注册servlet <servlet> <servlet-name>给servlet起个名字 名字唯一</servlet-name> <servlet-class>servlet的全限定名</servlet-class> </servlet> 绑定路径 <serlvet-mapping> <servlet-name>给servlet起个名字 名字唯一</servlet-name> <url-pattern>访问路径 目前都是以"/"开始</url-pattern> </serlvet-mapping> 3.访问路径: http://主机:端口号/项目名/路径 servlet的体系结构: 所有的servlet应该继承HttpServlet 间接的实现了Servlet接口 httpServlet中的方法: service(ServletRequest request,ServletResponse response):在这个方法中 将两个参数强转,调用了重载service方法 service(HttpServletRequest request,HttpServletResponse response):获取请求的方式,根据请求方式的不同调用相应doXxx方法 doGet和doPost方法:用来处理我们自己业务逻辑 servlet的生命周期 ★★★ url-pattern的配置: 完全匹配>目录匹配>后缀名匹配 load-on-startup:修改servlet的初始化时机 若我们自己的项目处理不了请求,服务器上有一个默认的servlet会帮我们处理 ///////////////////////////// servletConfig: servlet的配置对象: 获取servlet名称 初始化参数 获取全局管理者★ getServletContext() //////////////// servletContext: 上下文 作用: 1.获取全局的初始化参数 getInitParameter("key") 2.共享资源(域对象) xxxAttribute() 3.获取资源 getRealPath("/1.txt"):获取项目发布到服务器上位置的根目录 getResourceAsStream("/1.txt"):以流的形式返回一个文件 4.获取文件mime类型 getMimeType(文件名称) 域对象: servletcontext 创建: 销毁: //////////////////////////////