JavaWeb基础(尚硅谷)
jerry
2020-11-19
JavaWeb基础(尚硅谷) Servlet(尚硅谷) Servlet技术 什么是Servlet 1.Servlet是JavaEE规范之一, 规范就是接口 2.Servlet是JavaWeb三大组件之一, 三大组件分别是Servlet程序, Filter过滤器, Listener监听器 3.Servlet是运行在服务器上的java小程序, 可以接受客户端的请求, 并响应数据给客户 创建Servlet程序项目 创建一个类实现Servlet接口 WEB-INF/web.xml配置Servlet信息 新建一个Servlet工程模块(Tomcat, Web Application) 注意 <url-pattern>配置要以"/"开头, 一般以类名前一个单词配置访问地址 url地址定位 http://localhost:8080/servlet/hello /servlet 工程路径 /hello 资源路径 Servlet的生命周期 1.执行Servlet构造器方法 2.执行init初始化方法 3.执行service方法 4.执行destroy 第一次访问, 创建Servlet程序会调用 每次访问都会调用 在web工程停止时调用 Servlet请求的分发处理 通过继承HttpServlet实现Servlet程序(原理) 在实际项目开发中, 都是使用继承HttpServlet类的方式实现Servlet程序 步骤 1.创建一个类继承HttpServlet类 2.重写doGet或doPost方法 3.到web.xml中配置Servlet程序的访问地址 自动实现了请求分发处理, 不需要自己写 IDEA菜单生成Servlet程序 new → Create Servlet web.xml <servlet>自动生成了, 还需要配置<servlet-mapping> 实现Servlet程序 Servlet类的继承关系 Serlvet接口 GenericServlet类 HttpServlet类 自定义的Servlet程序 ServletConfig类 ServletConfig类是Servlet程序的配置信息类 ServletConfig类的三个作用 1.获取程序的别名servlet-name的值 2.获取初始化参数<init-param> 3.获取ServletContext对象 servletConfig.getServletName() servletConfig.getInitParameter("参数名") servletConfig. getServletContext() 其他 Servlet程序和ServletConfig对象都是Tomcat负责创建, Servlet程序默认是第一次访问时创建, ServletConfig是每个Servlet程序创建时就 创建一个对应的ServletConfig对象 ServletContext类 ServletContext是一个接口, 表示Servlet上下文对象, 一个web工程只有一个 ServletConttext对象实例 什么是ServletContext ServletContext是一个域对象(可以像Map一样存取数据的对象) 域对象 存数据: setAttribute() 取数据: getAttribute() 删除数据: removeAttribute() ServletContext类的四个作用 1.获取web.xml中配置的上下文参数<context-param> 2.获取当前的工程路径, 格式: /工程路径 3.获取工程部署后在服务器硬盘上的绝对路径 4.像Map一样存取数据 getInitParameter("Param") servletContext.getContextPath() getRealPath("/") Http协议 什么时HTTP协议 协议 : 指双方或多方约定好, 大家都要遵守的规则 HTTP协议, 指客户端和服务器之间通信时, 发送的数据, 需要遵守的规则 HTTP协议中的数据又叫报文 请求的HTTP协议格式 请求行 请求的方式 请求的资源路径[+?+请求参数] 请求的协议的版本号 GET HTTP/1,1 请求头 key: value 组成 不同的键值对, 表示不同的含义 POST请求 请求行 请求头 请求体 ===>>> 就是发送给服务器的数据 空行 提交内容格式 name=value&name=value 常用请求头 Accept:表示客户端可以接收的数据类型 Accpet-Languege:表示客户端可以接收的语言类型 Host:表示请求时的服务器ip和端口号 User-Agent:表示客户端浏览器的信息 结构 form标签是post请求 响应的HTTP协议 响应行 响应的协议和版本号 响应状态码 响应状态描述符 响应头 key: value 空格 响应体 结构 结构例 常见响应码 200 302 404 500 表示请求成功 表示请求重定向 表示请求服务器已经收到了, 但是请求地址错误(你要的数据不存在) 表示服务器收到请求, 但是服务器内部错误(代码错误) MIME类型说明 MIME是HTTP协议中的数据类型, 格式是"大类型小类型", 并与某一种文件的扩展名 相对应 什么是MIME Mupltipurpose internet Mail Extensions, 多功能Internet邮件扩充服务 常见MIME类型 超文本标记语言文本 普通文本 RTF 文本 GIF图形 JPEG图形 au声音文件 MIDI音乐文件 RealAudio音乐文件 MPEG文件 AVI文件 Gzip文件 TAR文件 .html ,.htm .txt .rtf .gif .jpeg,.jpg .au mid,.midi .ra,.ram .mpg,.mpeg .avi .gz .tar text/html text/plain application/rtf image/gif image/jpeg audio/basic audio/midi,audio/x-midi audio/x-pn-realaudio video/mpeg video/x-msvideo application/x-gzip application/x-tar HTTPServletResquest类 作用 每次有请求进入服务器, Tomcat服务器把HTTP协议信息解析好封装到Request对 象中, 传递到service方法(doGet和doPost)中给我们使用. 通过HttpServletRequest对象, 可以获取到所有请求信息 HttpSrevletRequest类常用方法 getRequestURI() 获取请求的资源路径 getRequsetURL() 获取请求的同意资源定位符(绝对路径) getRemoteHost() 获取客户端的ip地址 getHeader() 获取请求头 getParameter() 获取请求的参数 getParameterValues() 获取请求的参数(多个值的时候使用) getMethod() 获取请求的方式GET或POST setAttribute(key, value) 设置域数据 getAttribute(key) 获取域数据 getRequestDispatcher() 获取请求转发对象 Servlet请求参数 获取请求的参数值 java html 其他 解决post请求中文乱码 request .setCharacterEncoding ("UTF-8"); 请求的转发 什么是请求的转发 服务器收到请求后, 从一次资源跳转到另一个资源的操作叫请求转发 请求转发的特点 浏览器地址没有变化 是一次请求 共享Request域中的数据 可以转发到WEN-INF 不可以访问资源以外的资源 使用 注意 必须以"/"开头, 斜杆前路径为http://ip:port/工程名, 映射到web目录 Servlet1 1.request.setAttribute("key", "value"); 2.RequestDispatcher reqd = request.getRequestDispatcher(/servler); //资源名 3.reqd.forward(request, respond) Servlet2(接收) request.getAttribute("key"); base标签作用 设置页面相对路径工作时参考的地址 Web中的相对路径和绝对路径 相对路径 . 当前目录 .. 上一级目录 资源名 当前目录/资源名 绝对路径 http://ip:port/工程名/资源路径 web中 "/" 的不同意义 被浏览器解析是: http://ip:port Web中的路径 被服务器解析: http://ip:port/工路径 特殊情况: response.sendRediect("/"), 发送给浏览器解析, 得到 http://ip:port HTTPServletResponse类 作用 和HttPServletRequest类一样, 每次请求进来, Tomcat都会创建一个Response对 象传递给Servle程序使用 HttpServletResponse表示所有响应的信息, 可以设置返回给客户端的信息 输出流的说明 字节流 字符流 getOutStream() getWriter() 常用于下载(传递二进制数据) 常用于回传字符串(常用) 两个流同时只能使用一个 两个流 往客户端回传字符串数据 请求重定向 客户端发送请求, 服务端叫客户端去新地址访问(之前的地址被废弃), 叫请求重定向 response.setStatus(302) 色湖之响应状态码302, 表示重定向(以搬迁) response.setHeader("Location", "http://.....") 设置响应头, 说明新地址在哪里 重定向特点 实现 浏览器地址会发生变化 两次请求 不共享Request域中数据 不能web工程WEB-INF目录下的资源 可以访问工程外的资源 方案二(推荐使用) response.sendRedirect(http://...) 方案一 书城项目 javaEE三层架构 视图层(Web层) Service业务层 Dao持久层 1.获取请求参数, 封装成为Bean对象 2.调用Service层处理业务 3.响应数据给客户端, 请求转发, 重定向 1.处理业务逻辑 2.调用持久层保存到数据库 只负责跟数据库交互, CRUD操作 (Create, Read, Update, Delete) 客户端(浏览器) http://ip:port/工程路径/资源路径 数据库 Mysql, Oracle, DB2, SqlServer 功能操作 相关技术 Servlet程序 Webwork Strutus1.x Strutus2.x SpringMVC 相关技术 Spring框架 相关技术 JDBC DbUtils JdbcTemplate Mybatis Hiberante JBA 功能操作 1.项目结构 2.搭建书城项目环境 分层作用 为了解耦, 降低代码的耦合度, 方便后期的维护升级 目录结构 web层 service层 com.bookstore.web/servlet/controller com.bookstore.service com.bookstore.service.impl Service接口包 Service接口实现类 dao持久层 com,bookstore.dao Dao接口包 com.bookstore.dao.impl Dao接口实现类 实体bean对象 com.bookstore.entity/domain/bean JavaBean类 测试包 com.bookstore.test/junit 工具类 com.bookstore.utils 3.创建数据库(user用户表) sql 4.编写数据库对应的JavaBean对象 6.编写Dao持久层 5.编写工具类 JdbcUtils user类: pojo/User.java 7.编写Service业务层 编写BaseDao 用Dbutils类实现数据库的增删查改功能 用Druid实现创建数据库Connection和close()功能 编写UserDao接口 规范UserDaoImpl实现类的方法 编写UserDaoImpl 最终实现User对象与数据库交互操作的类, 继承BaseDao, 实现UserDao接口 Druid 编写UserDaoTest测试类 测试UserDaoImpl类的功能是否正常 编写UserService接口 规范登录, 注册, 检查用户名等功能 编写UserServiceImple 实现UserService接口的功能 编写UserServiceTest测试类 测试 8.编写Web层 实现用户注册功能 用户输入, 提交(submit), 把参数发送给服务器, 注册保存 RegistServlet程序 1.获取请求的参数 2.检查验证码是否正确 3.检查用户名是否可用 4.调用Service保存到数据库 不正确跳回注册页面 正确跳到注册成功页面 JDBC Tomcat(尚硅谷) JavaWeb的概念 什么是JavaWeb 指所有通过Java语言编写的可以通过浏览器访问的程序的总称叫JavaWeb 基于请求和响应来开发的 请求是指客户端给服务器发送数据, 加请求Request 响应是指服务器给客户端回传数据, 叫响应Response Web资源的分类 静态资源 动态资源 html, css, js, txt, mp4, jpg图片 jsp页面, Servlet程序 常用的Web服务器 Tomcat Jboss GlassFish Resin WebLogic Apache提供的一种Web服务器, 提供对jsp和Servlet的支持, 他是一种轻量级的 JavaWeb容器(服务器)(使用最广泛) 遵从JavaEE规范的, 开放源代码, 纯Java的EJB服务器, 支持所有的JavaEE规范 Oracle开发的JavaWeb服务器, 商业服务器, 达到产品服务级, 应用很少 CAUCHO公司的产品, 是个非常流行的服务器, 对jsp和servlet提供良好的支持, 性 能也比较优良, 自身采用Java语言开发(收费, 应用较多) Oracle的产品, 目前(收费服务器中)应用最广泛的Web服务器, 支持JavaEE, 适合大 型项目(收费, 用的不多, 适合大公司) Tomcat的使用 安装 官网 目录 bin 存放可执行程序 conf 存放Tomcat服务器配置文件 lib 存放Tomcat服务器的jar包 logs 存放运行输出的日志 temp 存放运行是产生的临时数据 webapps 用来存放部署的Web工程 work Tomcat工作时的目录, 存放运行时jsp翻译为servlet的源码, 和session的钝化(把对 象写到磁盘上)目录 启动 下载zip安装包并解压 1.执行bin目录下的startup.bat文件 测试Tomcat是否启动成功 http://localhost:8080 或真实ip:8080 startup.bat启动失败常见原因 java环境没有配置好 启动方式 2.用命令行窗口在bin目录下执行: catalina run 停止 停止方式 1.关闭Tomcat窗口或Ctrl+C 2.bin目录下的shutdown.dat 修改Tomcat的端口 conf目录下的server.xml 修改Connector标签的port属性, 重启Tomcat 部署Web工程到Tomcat 创建工程在Webapps目录下 方式一 方式二 在conf\Catalina\localhost 工程访问名.xml 配置 工程访问名.xml < Context path="/工程访问名" docBase="工程目录路径"/> 如path="a" localhost:8080/a 表示访问docBase目录下的工程 访问 : IP地址:8080/工程名 IDEA整合Tomcat服务 Setting→Build,Execution,Deployment→Application Servers 配置Tomcat安装路径 Run→Edit Configuration,添加Tomcat Server, IDEA2020配置 创建动态web工程 创建好工程模块后, 右键Add Framework→勾选Web Application 动态Web工程目录简介 web 用来存放web工程的资源文件, html, css, js等 WEB-INF 受服务器保护的目录, 浏览器无法直接访问此目录的内容 web.xml 整个动态web工程的配置部署描述文件, 可以在这里配置很多web工程主件, 如 servlet, filter过滤器, Listener监听器, Session超时等 lib 存放 第三方jar包 在idea中部署工程到Tomcat运行 确认Deployment(部署)中有要部署的模块 JRE栏要设置个jdk目录 其他 Tomcat实例使用细节 Application context : 工程访问路径 frame deactivation(钝化) 可选择有修改时热部署(内容即使更新到页面) 钝化为金属的化学反应, 应该理解为框架内容"生锈了", 有更新了, 太久了, 中文没有 准确直译 Configuration 的Tomcat设置 XML(尚硅谷) XML介绍 什么是XML Extensible Markup Language可扩展标记语言 作用 可用于保存数据 作为项目或模块的配置文件 可以作为网络传输数据的格式(还是以JSON为主) XML语法 直接举例 .... XML文档必须有根元素 根元素就是没有父标签的元素(顶级元素), 只能有唯一一个 XML的特殊字符 如"<"是&lt; ">"是 &gt; <![CDATA[这里输入特殊字符]]> 例 : <![CDATA[<<<>>>]]> XML解析 html和xml都是标记行文档, 都可以使用w3c指定dom技术来解析 需要知道的历史 JDK早期提供了两种解析技术, DOM和Sax(Simple API for XML)(都以过时) 第三方解析 jdom dom4j pull 在dom的基础上进行封装 在jdom的基础上又进行封装 主要用在Android开发, 跟sax类似, 都是事件机制解析xml文件 dom4j解析技术 dom4j官网(下载jar包, java文档) 使用 1.获得document对象 用SAXReader类 read()方法 创建一个SaxReader输入流, 读取xml文件, 2.通过Document对象获取根元素 getRootElement() 3.通过根元素获取指定标签对象 elements("标签名"), 返回List<Element> 4.遍历List, 将每个标签转换为java类 getText()获取标签中的文本内容 elementText("price")直接获取指定标签名的文本内容 attributeValue("sn"); 获取指定属性内容 asXML() 把标签对象. 转换为标签字符串 jsp(尚硅谷) 简介 什么是jsp java server pages, java的服务器页面,是一种动态网页开发技术。它使用JSP标签在 HTML网页中插入Java代码 作用 代替Servlet程序回传html页面的数据(Servlet回传页面数据操作繁琐, 开发维护成 本高) 好像都说jsp过时了, 了解就行 jsp页面的本质 第一次访问jsp页面时, tomcat服务器会把jsp页面翻译成为一个java源文件, 并且对 他进行编译成.class字节码程序. jsq头部的page指令 打开java源文件发现里面的内容, 跟踪源代码发现, HttpJspBase类, 直接地继承 HttpServlet, jsp翻译出来的java类, 简介继承了HttpServlrt, 也就是说, 翻译出来的 是一个Servlet 总结: jsp就是Servlet程序 page指令可以修改jsp页面中的一些重要的属性, 或者行为 language属性 contentType属性 pageEncoding属性 import属性 autoFlush属性 buffer属性 errorPage属性 isErrorPage属性 session属性 extends属性 属性 jsp中常用的脚本 表示jsp翻译后是什么文件, 暂时只支持java 表示jsp返回的数据类型是什么, 也是源码中的response.setContentType()参数值 表示当前jsp页面文件本身的字符集 表示java源代码中一样, 用于导包, 异类 设置当out输出流缓冲区满了之后, 是否自动刷新缓冲级区, 默认值是true 设置out缓冲区的大小, 默认是8kb 设置jsp页面运行时出错, 自动跳转去的页面路径 设置当前jsp页面是否时错误信息页面, 默认false, 如果是true可以获取默认信息 设置访问当前jsp页面, 是否会创建HttpSession对象, 默认是true 设置jsp翻译出来的java类默认继承谁 jsp常用的三种语法 声明脚本(极少使用) 格式: <%! 声明java代码%> 可以给jsp翻译出来的java类定义属性和方法甚至是静态代码块, 内部类 练习 声明类属性 声明static静态代码块 声明方法 声明内部类 表达式脚本(常用) 格式: <%=表达式%> 作用: 在jsp页面上输出数据 特点: 练习 输出类型 输出浮点型 输出字符串 输出对象 所有的表达式脚本搜会本翻译成为out,print()输出到页面上 所有表达式脚本都会被翻译到_jspService方法中 哟与表达式脚本中翻译的内容都在_jspService()方法中, 所以_jspService()方法中 的对象都可以直接使用 代码脚本 格式: 代码脚本的格式 <%java语句%> 代码脚本的作用是: 可以在jsp页面中, 编写我们自己需要的功能(写的是java语句) 练习 代码脚本--if语句 代码脚本--for循环语句 翻译后java文件中_jspService方法内的代码都可以写 作用 特点 代码脚本翻译后都在_jspService方法中() 所有_jspSevice()方法中现有对象都可以直接使用 可以由多个代码脚本快组合完成java语句 代码脚本还可以和表达式脚本一起组合使用, 在jsp页面上输出数据 jsp中的三种注释 html注释 java注释 jsp注释 <%--能注释掉jsp页面中所有代码--%> jsp内置对象 内置对象: 指Tomcat在翻译jsp页面成为Servlet源代码后, 内部提供九大对象 request 请求对象 response 响应对象 pageContext jsp的上下文对象 session 会话对象 application ServletContext对象 config ServletConfig对象 out jsp输出流对象 page 指向当前jsp的对象 九大对象 exception 异常对象 四个域对象 pageContext (PageContextImpl类) request (HttpServletRequest类) session (HttpSession类) application (SevletContext类) 当前_jsp页面范围内有效 一次请求内有效 一个绘画范围内有效 (打开浏览器访问服务器, 知道关闭服务器) 整个web工程范围内部都有效(只要web工程不停止, 数据都在) 四个域对象功能都一样, 能像Map一样存取数据的对象, 不同的是他们对数据的存取 范围 有效范围例 scope.jsp scope2.jsp 四个域对象 使用优先顺序(范围从小到大) pageContext → request → session → application out输出 response中表示响应, 用于设置返回给客户端的内容, out也是客户端输出使用的 jsp代码执行完后 执行out.flush()操作, 会把out缓冲区中的数据追加写入到response缓冲区末尾 然后会执行response的刷新操作, 把全部数据写个客户端 jsp翻译后, 底层源码都是使用out来进行输出, 所以统一使用out输出, 避免打乱页面 输出内容的布局 和response.getWriter()输出区别 执行过程 out.print()可以输出任意数据(最后还是转为字符串用write()输出) out.write()可以输出字符串 深入源码, 浅出结论 在jsp页面中, 可以统一使用out.print()输出 jsp常用标签 静态标签 动态标签 一个页面 网站导航条, 菜单, 轮播广告, 用户登录信息, 天气信息,, 等等 页面主体内容 加入我们, 友情链接, 联系我们, 版权归属....等等 <%@ include file="/"%> file属性指定要包含的jsp页面 "/"表示为http://ip:port/工程路径/ 特点 静态包含不会翻译被包含的jsp页面 静态包含其实是被包含的jsp页面的代码拷贝到包含的位置执行输出 <jsp:include page="/"></jsp:include> page 属性: 指定要包含的jsp页面的路径 特点 动态包含会把包含的jsp页面也翻译成java代码 main.jsp把自己的request, response, out对象传递给了footer.jsp页面去使用 JspRuntimeLibrary.include(request, response, "footer.jsp", out, false) 底层代码使用此方法调用被包含的jsp页面执行输出 动态包含还可以传递参数 请求转发 <jsp:forward page="scope2.jsp"></jsp:forward> 请求转发的使用说明 1.获取请求的参数(Servlet程序) 2.发sql语句到数据库去查询学生信息(Sevlet程序) 4.遍历查询到的结果输出给客户端, 显示(JSP程序) 3.保存查询到的学生信息到request域中, 请求转发到jsp程序 Listener监听器 什么是Listener Listener监听器是JavaWeb的三大组件之一.JavaWeb三大组件分别是: Servlet程 序, Filter过滤器, Listener监听器 Listener是JavaEE的规范, 就是接口 监听器的作用是, 监听某件事务的变化, 然后通过回调函数, 反馈给客户(程序)去做一 些响应的处理 ServletContextListener监听器 监听Servlet对象的创建和销毁, ServletContextListener在web工程启动时创建, 在 web工程停止时销毁 两个方法 contextInitialized() 在ServletContext对象创建之后马上做初始化 contextDestroyed() 在ServletContext对象销毁时调用 使用步骤 1.编写一个类实现ServletContextListener 2.实现其两个回调方法 3.到web.xml配置监听器 EL(尚硅谷) 什么是EL表达式 Expression Language. 表达式语言 作用 替代jsp页面中的表达式脚本在jsp页面中进行数据的输出 比jsp表达式脚本要简介很多 格式 ${表达式} 输出null值时时空串, jsp则会输出"null"字符串 搜索四个域的顺序 pageContext→request→session→application 注意: session保存的数据在浏览器关闭后才销毁 从小到大的顺序 输出复杂的Bean对象 EL找的时getter方法, 不是属性 关系运算 ${ 3==3 } 运算 逻辑运算 ${ 22==22 && 12>11} !=, > ,<, >=, <= &&(与), ||(或), !(非), 算数运算 +, -, *, /, % 都是java的运算符 empty运算 判断一个数据是否为空(空对象) ${ empty "Str"} 三元运算 表达式 ? 值1 : 值2 点运算,中括号运算 ${map.key} ${map[key.1]} 可以输出key值里含有特殊字符的值 EL的11个隐含对象 pageContext 可以获取jsp中的九大内置对象 pageScope 可以获取pageContext域中的数据 requestScope 可以获取Request域中的数据 sessionScope 可以或Session域中的数据 applicationScope 可以SevletContext域中的数据 param 获取请求参数的值 paramValues 获取请求参数的值, 获取多个值的时候使用 header 获取请求头的信息 headeValues 获取请求头的信息, 可以获取多个值的情况 cookie 获取当前请求的Cookie信息 intParam 可以获取在web.xml中配置的<context-param>的上下文参数 四个特定域中的属性 11个隐含对象 pageScope requestScope sessionScope applicationScope 可以获取pageContext域中的数据 可以获取Request域中的数据 可以或Session域中的数据 可以SevletContext域中的数据 作用 选择性的输出域中的数据(而不是默认的搜索域顺序) ${session.key1} PageContext 使用 协议 服务器ip 服务器端口 获取工程路径 获取请求方法 获取客户端ip地址 获取会话的id编号 其他隐含对象示例 ${param} 获取所有url请求参数的值 ${param.参数名} http://ip:port/工程名/资源路径?参数名=值1&参数名2=值2 只获得参数值, (一个参数名有多个值用数组) ${paramValues.参数名[0]} ${header} ${header['User-Agent']} 获得请求头信息 ${headerValues['User-Agent'][0]} ${cookie} 只获得值数组 ${cookie.JSESSIONID.name} 获得cookie名称 ${cookie.JSESSIONID.value} 获得cookie值 ${initParam} 输出web.xml中<context-param>的上下文参数 ${initParam.key值} JSTL标签库 什么JSTL标签库 JSP Standard Tag Library, JSP标准标签库, 可以替换代码脚本, 使得jsp页面更加简 五组标签库 核心标签库(重点) 格式化 函数 数据库(不使用) XML(不使用) 使用步骤 1.导入jstl的jar包 maven依赖 2.使用taglib指令引入标签库 <%@ taglib prefix="c" uri="http://java.sun.com/jstl/core" %> set标签 可以往域里面保存数据 作用 属性 <c:set ></c:set> scope属性 设置保存到那个域 默认值: pageContext var 设置key value 设置值 idea遇到问题 解决办法 无法在web.xml或使用此应用程序部署的jar文件中解析绝对uri:[http:// java.sun.com/jstl/core] 参考 if标签 <c:if scope="request" var="key" test=""></c:if> 用来做if判断 test 教程里的例子 属性 <:choose>, <c:when>, <c:otherwise> 多路判断 otherwise标签表示剩下的情况 标签里不要使用html注释, 要使用jsp注释 注意 <c:forEach>标签 属性 begin 开始遍历的索引(默认0) end 结束的索引 var 表示遍历的变量 遍历1到10 遍历Object数组 遍历Map集合 遍历List集合 根据标记文件中的tld或attribute指令,attribute items不接受任何表达式** 参考 解决办法 item 表示遍历的集合 step 表示遍历的步长值(每次遍历增加的索引) varStatus 表示当前遍历到的数据的状态 getCurrent() 表示当前遍历到的数据 getIndex() 表示遍历的索引 getcount() 表示遍历的个数 isFirst() 当前数据是否是第一条 isLast() 当前数据是否是最后一条 getBegin() getEnd() getStep() 获取begin属性值 获取end属性值 获取step属性值 文件的上传下载 文件上传简介 用form标签, method=post请求 form标签的encType属性值需为multipart/form-data值 在form标签中使用input type=file添加上传文件 编写服务器代码(Servlet程序)接受, 处理上传数据 http协议内容 encType=mutipart/form-data : 表示提交的数据以多段的形式进行拼接, 然后以二 进制流形式发送给服务器 Content-Type boundary : 表示每段数据的分隔符, 分隔符由浏览器随机生成 上传用到的类和方法 导入commons-fileupload.jar 需要依赖commons.io.jar, 所以要导入两个jar包 两个jar包常用的类 ServletFileUpload类 用于解析上传的数据 isMultipartContent() 判断上传的数据格式是否是多段的(不是的无法解析) parseRequest() 解析上传的数据, 得到List<FileItem>(多个表单项) isFormField() 判断当前表单项是否是普通表单项, 返回false是上传的文件类型 getFieldName() 获取表单项的name属性值 getString() 获取当前表单项的值 getName() 获取上传的文件名 write() 将上传的文件写到本地硬盘 FileItem 遇到的Http500错误 java.lang.ClassNotFoundExection 解决 : 把依赖的jar包放入Tomcat安装目录的lib里 文件下载实现 步骤 1.获取要下载的文件名 2.读取要下载的文件内容 4.把下载的文件内容回传给客户端 3.通过响应头告诉客户端返回的数据类型, 收到的数据是用于下载使用的 问题 右键New没有Create Servlet选项 解决: 在Project structure 里的Module里把src设为source路径 中文下载名乱码问题 URLEncoder.encode("中文名.jpg", "UTF-8") url编码是把汉字转换成%xx%xx%xx的格式 Base64编解码操作 Chrome, IE解决 火狐解决 不同浏览器要用不同的编码适配, 加个判断是什么样的浏览器 判断是否是火狐浏览器 Cookie 什么是Cookie Cookie是服务器通过客户端保存键值对的一种技术 客户端有了Cookie后, 每次请求都发送给服务器 每个Cookie的大小不能超过4kb 创建Cookie 步骤 1.创建Cookie对象 2.通知客户端添加Cookie new Cookie("key", "value") response.addCookie(Cookie) 获取Cookie Servlet程序获取Cookie getName() 获取key名 getValue() 获取Value值 CookieUtils类 获取指定cookie Cookie值修改 方案一 1.创建key值同名的Cookie对象 2.调用response.addCookie(Cookie) 方案二 1.找到要修改的Cookie对象 2.调用setValue()方法赋予新的Cookie值 3.调用response.addCookie()通知客户端保存修改 4.例 注意 Cookie的value值不应包含空格或标点符号等特殊字符, 若使用二进制值可能需要 BASE64编码 Cookie生命控制 setMaxAge() 正确: 表示在指定的秒数后过期 负数(默认值-1): 浏览器关闭Cookie就会被删除 Cookie的path属性 过滤发送给服务器的Cookie path属性: 发送请求地址在path路径子目录下的Cookie response.setPath() 练习 免用户名登录 客户端 服务器 login.jsp页面 LoginServlet程序 获取正确用户名密码 把用户名保存为Cookie发送给服务器 Session 什么是Session Session就是一个接口(HttpSession) Session就是一个会话, 用来维护客户端和服务器之间的一种关系 每个客户端都有一个Session会话 Session 会话用来保存用户登录之后的信息 Session的创建和获取 request.getSession() 获取Session对象, 第一次调用会创建Session对像 isNew() getId() 判断是否是刚创建的对象 获取会话的唯一id值 Session域中存储数据 request.getSession() .getAttribute("key") 获取域中数据 request.getSession(). setAttribute("key", "value") 往域中保存数据 Session超时的控制 request.getSession(). setMaxInactiveInterval() 设置最长不活动时间(超时销毁), 单位秒, 如果设为负数则永不超时(不建议) request.getSession() .getMaxInactiveInterval() 获取超时时长 web.xml设置默认超时时长 session.invalidate() 让Session会话马上超时 浏览器和Session之间关联的技术 客户端没有Cookie 发送请求给服务器, 服务器getSession()创建Session对象, 创建Session对象的同时 都会创建Cookie, 且key永远时JSESSIONID, value值就是Session对象的id值 , setCookie响应给客户端 客户端有了Cookie后 每次请求都会把Session的id以Cookie的形式发送给服务器 → 服务器getSession 从一堆Session对象中找到创建好的Session(对应该客户端), 并返回 Filter 什么是Filter过滤器 JavaWeb三大组件之一(Servlet程序, Listener监听器, Filter过滤器) Filter过滤器是JavaEE规范, 就是接口 作用: 拦截请求, 过滤响应 拦截常见应用 权限检查 日志操作 事务管理 ...... Filter过滤器基本使用 Web工程下要有一个admin目录, 该目录的资源都是用户登录后才允许访问 要求 判断Session中是否包含有用户登录信息 判断是否登录 步骤 实现过滤方法doFilter() Filter接口方法 doFilter() 用于拦截请求, 可以做权限检查 init() destroy() web.xml配置 用户登录和检查 步骤 编写一个类实现Filter接口 实现过滤方法doFilter() 配置web.xml 编写一个类实现Filter接口(javax.servlet) 访问拦截路径里的资源就会先运行doFilter()方法 LoginServlet 思路 访问拦截路径里的资源 doFilter()方法执行 判断username=null跳回登录界面(login.jsp) username!=null继续执行访问资源 登陆界面发送用户名密码 正确, setSession("username"), 下一次访问资源时即可正常访问 错误, 跳回登录界面 Filter生命周期 1.构造器方法 2.init初始化方法 3.doFilter()方法 4.detroy销毁 web工程启动时执行 每次拦截请求时就会执行 执行web工程时执行 FilterConfig类 Filter过滤器的配置文件类 Tomcat创建Filter时, 会同时创建一个FilterConfig类, 包含Filter配置文件的配置信 获取去Filter过滤器的配置内容 获取filter-name 获取<Filter>里的<init-param>初始化参数 获取ServletContext对象 getFilterName() getInitParameter() getServletContext() FilterChain多个过滤器执行细节 Chain(链条), FilterChain就是过滤器链, 多个过滤器执行 FilterChain.doFilter() 执行下一个Filter过滤器(如果有) 执行目标资源(如果没有) 多个Filte过滤器执行顺序 web.xml配置文件里谁先配置, 就谁先执行 如果是注解配置, 按类名字母顺序执行 特点 1.所有Filter和目标资源默认都在同一个线程中 2.多个Filter共同执行时, 都使用同一个Request对象 Filter的拦截路径 精确匹配 目录匹配 后缀名匹配 <url-pattern>/target.jsp</url-pattern> <url-pattern>/admin/*</url-pattern> <url-pattern>*.html</url-pattern> JSON 什么是json JavvaScript Object Notation, 一种轻量级(与xml比)的数据交换格式, 易于人阅读 和编写, 很多语言都提供了对json的支持 json的定义 json由键值对组成, 并且由花括号包围包围, 每个键由引号引起来, 键和值之间使用 冒号分隔 , 多组键值对之间用逗号进行分隔 json的访问 jsonObj.key1 json是一个对象, 其key相当于属性 json的两个常用方法 说明 JSON.stringiy() JSON.parse() 把json对象转为字符串 把json字符串转换成为json对象 要操作json中的数据时, 需要json对象格式 在客户端于服务器之间进行数据交换的时候, 使用json字符串 JavaBean对象和json的相互转换 导入gson jsr包 Gson类方法 toJson() JavaBean对象 转Json字符串 fromJson((str, 对象.class),) Json字符串转对象 List集合于json的相互转换 List集合转json字符串 toJson() json对象转List集合 1.编写一个类继承TypeToken(Gson提供的类) 2.fromJson(str, new TypeToken<List<Person>>(){}.getType()) map集合和json的相互转换 json对象转map集合 编写一个类继承TypeToken(Gson提供的类)或使用匿名内部类 fromJson() map集合转json字符串 toJson() AJAX Asynchronous Javascript And XML(异步JavaScript和XML), 是一种创建交互式 网页应用的网页开发技术 ajax是一种浏览器通过js异步发起请求. 局部更新页面的技术. 什么是AJAX请求 Ajax请求示例 步骤 1.创建XMLHttpRequest 2.调用open()设置请求参数 4.调用send()发送请求 3.绑定onreadystatechange事件, 处理请求完成后的操作 获取服务器的响应 使用XMLHttpRequest对象的responseText或responseXML属性 onreadystatechange事件 每当readyState属性改变时, 就会调用该函数 readyState属性值 0: 请求未初始化 1: 服务器连接已建立 2: 请求已接受 3: 请求处理中 4: 请求已完成, 且响应已就绪 status属性 200: "OK" 404: 未找到页面 当readyState==4并且status==200才调用 ajax.html AjaxServlet.java Ajax请求特点 Ajax请求的局部更新 浏览器地址栏不会发生变化 局部更新不会舍弃原来页面的内容 jQuery中的Ajax请求 实际开发很少写原生Ajax代码, 一般通过jQuery或一些框架实现Ajax请求 $.ajax()方法 url type data success dataType 请求的地址 请求的类型, GET或POST 发送给服务器的数据 请求响应, 响应回调的函数 响应的数据类型 格式 key=value&key1=value1 {key:value} $.get()和$.post()方法 常用数据类型: text, xml, json 1.url 2.data 是$.ajax()基础上的进一步封装 请求的url地址 3.callback 4.type 返回数据类型, 有xml,html, json, text, _default 载入成功时的回调函数 发送的数据 说明 要按顺序传这四个参数, post与get使用完全一样 参数 参数 $.getJSON() 参数 url data callback 请求的url地址 发送给服务器的数据 载入成功的回调函数 说明 比$.get()少了type参数, 使用方法一样 表单序列化 serialize() 获取表单中的所有表单项的内容, 并以name=value&name=value的形式进行拼接 $("#formId").serialize() 作用 可直接加载url后面,发送给服务器 注意url后面要有个"&" i18n国际化(了解) 什么是i8n国际化 在不同的国家显示不同的语言, 但一般真的有国际化需求的公司采用的方案都是不 同国家单独创建不同的网页 Internationalization(国际化), 以i开头, n结尾, 中间有18个字母 国际化三素 Locale对象 Locale表示不同的时区, 位置, 语言 zh_CN 中国, 中文 en_US 英文, 美国 Properties属性配置文件 国际化配置文件命名规则 baseName_locale.properties 如 : i18n_zh_CN.proerties ResourceBundle资源包 ResourceBundle.getBundle() 根据给定的baseName和Locale读取相应的配置文件, 得到文字信息 国际化基础示例 通过请求头实现国际化 使用JSTL标签库fmt实现国际化 1.使用标签设置Locale信息 <fmt:setLocale value="${param.locale}"/> 2.使用标签设置baseName <fmt:setBundle basename="i18n" /> 3. 使用标签输出国际化信息 <fmt:message key="username”/> 步骤 属性表示判断的条件(使用EL表达式输出) Session销毁