回顾:http:: 超文本传输协议 请求和响应servlet: 运行在服务器端的一个java小程序,本质就是一个类 接受请求,处理逻辑,生成动态内容 编写步骤: 1.编写一个类 继承HttpServlet 重写doGet或者doPost方法 2.编写路径3.测试 http://主机:端口号/项目名/路径 servlet的体系结构: Servlet--->GenericServlet-->HttpServlet HttpServlet: 实现了service方法,强转了两个参数,调用了重载的service方法 重载的service方法中,获取请求的方式,根据请求方式的不同调用相应的doXxx方法 doGet():处理get请求的逻辑 doPostt():处理post请求的逻辑 (只有表单提交的时候把method设置成post的时候) servlet的生命周期: init(ServletConfig config): service(ServletRequest request,ServletResponse response): destroy():/ url-pattern的配置: 完全匹配 /a/b 目录匹配 /a/b/* 后缀名匹配 *.jsp 优先级:完全匹配 >目录匹配 >后缀名匹配 一个路径对应一个servlet 一个servlet可以对应多个路径// load-on-startup:修改servlet的初始化时机 当我们的项目处理不了请求的时候,服务器里面defaultservlet来处理.// 路径的写法: 相对路径 绝对路径:(常用) 带主机和协议的路径(访问站外资源) 不带主机和协议的路径(最常用的) /项目名/资源路径servletConfig:(了解) servlet的配置对象 作用: 获取servlet的名称 获取servlet初始化参数 ★获取全局管理者servletContext: 上下文(全局管理者) 作用: 1.获取全局的初始化参数 2.共享资源 3.获取资源 4.获取文件的mime类型 获取: 在servlet中直接调用 getServletContext() 常用方法: String getInitParameter(String key):根据key获取指定的初始化参数 String getRealPath(String 文件路径):获取的指定文在在tomcat上的绝对路径 文件路径从项目的根目录往后写 InputStream getREsourceAsStream(String 文件路径):以流的形式返回一个文件 String getMimeType(文件名):格式 大类型/小类型 /域对象: 创建:在服务器启动的时候,服务器会为每一个项目创建一个全局管理者,servletcontext就是当前项目的引用 销毁:在项目被移除或者服务器关闭的时候销毁 常用的方法: xxxAttribute() setAttribute(String key,Object value) Object getAttribute(String key) removeAttribute(String key)//通过类加载器获取文件的路径(处于classes目录下的文件) 类.class.getClassLoader().getReource("文件路径").getPath() 类.class.getClassLoader().getReourceAsStream("文件路径")//要求:会使用request和response案例1-文件下载案例技术分析: response 文件下载//response:响应 作用: 往浏览器写东西 组成部分: 响应行 响应头 响应体 操作响应行 格式: 协议/版本 状态码 状态码说明 状态码: 1xx:已发送请求 2xx:已完成响应 200:正常响应 3xx:还需浏览器进一步操作 302:重定向 配合响应头:location 304:读缓存 4xx:用户操作错误 404:用户操作错误. 405:访问的方法不存在 5xx:服务器错误 500:内部异常 常用方法: setStatus(int 状态码):针对于 1 2 3 了解 : sendError(int 状态码):针对于 4xx和5xx 操作响应头 格式:key/value(value可以是多个值) 常用的方法: setHeader(String key,String value):设置字符串形式的响应头 了解:setIntHeader(String key,int value):设值整形的响应头 了解:setDateHeader(String key,long value):设值时间的响应头 addHeader(String key,String value):添加置字符串形式的响应头 之前设置过则追加,若没有设置过则设置 了解:addIntHeader(String key,int value):添加整形的响应头 了解:addDateHeader(String key,long value):添加时间的响应头 常用的响应头: location:重定向 refresh:定时刷新 content-type:设置文件的mime类型,设置响应流的编码及告诉浏览器用什么编码打开 content-disposition:文件下载 重定向: 方式1: ★response.sendRedirect("/day10/loc2"); 方式2: response.setStatus(302); respooen.setHeader("location","/day10/loc2"); 定时刷新: 方案1:设置头 refresh 昨天做过 respooen.setHeader("refresh","秒数;url=跳转的路径"); 方案2:http的meta标签 / 操作响应体: 页面上要展示的内容 常用方法: Writer getWriter():字符流 ServletOutputStream getOutputStream() :字节流 自己写的东西用字符流,其他一概用字节流. 处理响应中文乱码: 方式1:★ response.setContentType("text/html;charset=utf-8"); 方式2:理解 response.setHeader("content-type", "text/html;charset=utf-8"); 注意: 两个流互斥 当响应完成之后,服务器会判断一下流是否已经关闭,若没有关闭,服务器会帮我们关闭.(底层使用的缓冲流)// 文件下载: 下载方式: 1.超链接下载 下载 day10.txt 若浏览器能解析该资源的mime类型,则打开;若不能接下则下载; 2.编码下载 通过servlet完成 下载 day10.txt a.设置文件的mime类型 String mimeType=context.getMimeType(文件名) response.setContentType(mimeType); b.设置下载头信息 content-disposition response.setHeader("content-disposition", "attachment;filename="+文件名称); c.提供流 response.getOutputStream(); 扩展:使用commons-io工具类 对拷流: IOUtils.copy(is,os);/扩展: 通过response生成验证码 验证码: 作用:防止暴力攻击 点击换一张的js代码: function changeImg(obj){ //操作src属性 obj.src="/day10/code?i="+Math.random(); //alert(1) }// 案例2-完成用户注册操作需求: 在一个表单页面上填写用户数据,点击提交,将所有的数据提交的服务器上,通过java代码最终保存到数据库中.技术分析: 表单 requestrequest:请求 作用:获取浏览器发送过来的数据 组成部分: 请求行 请求头 请求体 操作请求行 格式: 请求方式 请求资源 协议/版本 常用方法:HttpServletRequest 掌握 String getMethod():获取请求方式 String getRemoteAddr():获取ip地址 String getContextPath() :在java中获取项目名称 (/day10) 了解: getRequestURI():获取的是 从项目名到参数之前的内容 /day10/regist getRequestURL():获取的带协议的完整路径 http://localhost/day10/regist String getQueryString():get请求的所有参数 username=tom&password=123 String getProtocol():获取协议和版本 例如:请求行 GET /day10/row?username=tom&password=123 HTTP/1.1 // 操作请求头 格式:key/value(value可以是多个值) 常用方法: ★String getHeader(String key):通过key获取指定的value (一个) 了解: Enumeration getHeaders(String name) :通过key获取指定的value(多个) Enumeration getHeaderNames() :获取所有的请求头的名称 int getIntHeader(String key):获取整型的请求头 long getDateHeader(String key):获取时间的请求头 重要的请求头: user-agent:浏览器内核 msie firefox chrome referer:页面从那里来 防盗链 /// 操作请求参数 ★ username=tom&password=123&hobby=drink&hobby=sleep 常用方法: String getParameter(String key):获取一个值 String[] getParameterValues(String key):通过一个key获取多个值 Map getParameterMap():获取所有的参数名称和值 username:tom ---------values--------- hobby:[drink, sleep] =====map======= username::[tom] password::[123] hobby::[drink, sleep] // 请求的中文乱码: 对于get请求:参数追加到地址栏,会使用utf-8编码,服务器(tomcat7)接受到请求之后,使用iso-8859-1解码,所以会出现乱码 对于post请求,参数是放在请求体中,服务器获取请求体的时候使用iso-8859-1解码,也会出现乱码 通用的方法: new String(参数.getBytes("iso-8859-1"),"utf-8"); 针对于post请求来说:只需要将请求流的编码设置成utf-8即可 request.setCharacterEncoding("utf-8");/域对象: request: 创建:一次请求来的时候 销毁:响应生成的时候 作用: 一次请求里面的数据 请求转发(请求链,请求串) request.getRequestDispatcher("内部路径").forward(request,response);/// /// 案例2-步骤分析: 1.数据库和表(day09) 2.页面(表单) 给每个字段添加name属性 还需修改表单提交的路径 method=post 3.表单提交到一个servlet(RegistServlet) 4.RegistServlet: 操作: 接受数据,封装成一个user 调用UserSerivce完成保存操作 int regist(User user) 判断结果是否符合我们预期 若int=1; 插入成功 若int!=1; 插入失败 相应的提示信息在当前的servlet不做处理,将信息转发给另一个servlet展示(MsgServlet); 5.UserService 调用dao 6.userdao 通过dbutils在数据库中插入一条记录.//封装对象: apache提供的一个工具类 BeanUtils 封装数据 使用步骤: 1.导入jar包 2.调用 BeanUtils.populate(Object bean,Map<> 参数); //请求转发和重定向区别: 重定向发送两次请求,请求转发一次请求 重定向地址栏发生该表,请求转发不变 重定向是从浏览器发送,请求转发是服务器内部 重定向不存在request域对象,请求转发可以使用request域对象 重定向是response的方法,请求转发是request的方法 重定向可以请求站外资源,请求转发不可以 / / 扩展: URLEncoder.encode(s, "utf-8"); 指定编码 URLDecoder.decode(s8, "iso8859-1");指定解码文件下载扩展: 中文名称的文件名下载的时候名称会出现问题 常见的浏览器需要提供文件名称的utf-8编码 对于火狐来说需要提供文件名称的base64编码 方案1:使用工具类 方案2:网上的方式(8成好使) new String(filename.getByte("gbk"),"iso8859-1");////////////上午回顾:response: 操作响应行 状态码 常用方法: setStatus(int code) 针对的1xx 2xx 3xx 操作响应头: setHeader(String key,String value):设置 addHeader(String key,String value):添加 常用的响应头: location:重定向: response.sendRedirect("跳转路径"); refresh:定时刷新 response.setHeader("refresh","秒数;url=路径");//java meta标签//html代码 content-type:设置文件的mimeType,及设置响应流的编码并且通知浏览器用什么编码打开 response.setContentType("text/html;charset=utf-8"); content-disposition:设置文件下载 response.setHeader("content-disposition","attachment;filename="+文件名称); 操作响应体 getWriter(): getOutputStream(): 注意:俩流互斥,服务器帮我们关闭此流 响应的中文乱码: response.setContentType("text/html;charset=utf-8");文件下载: 1.超链接下载 2.编码下载(两个头一个流) 设置文件的mimetype 设置下载头信息 对拷流 扩展: 文件名称中文问题: 方法1: firefox :base64 其他:utf-8 方法2:(八九成可以使用) new String(filename.getBytes("gbk"),"iso8859-1");request:请求 获取浏览器发送过来的数据 操作请求行 getMethod():请求方式 getContextPath():获取项目名称 getRemoteAddr():获取请求的ip地址 操作请求头 String getHeader(String key) 常见的头信息: user-agent:获取浏览器内核 referer:页面从那里跳转过来的 操作请求参数 String getParameter(String key): String[] getParameterValues(String key): Map getParameterMap(); 请求的中文乱码: 对于get请求:参数追加到地址栏,会使用utf-8编码,服务器(tomcat7)接受到请求之后,使用iso-8859-1解码,所以会出现乱码 对于post请求,参数是放在请求体中,服务器获取请求体的时候使用iso-8859-1解码,也会出现乱码 通用的方法: new String(参数.getBytes("iso-8859-1"),"utf-8"); 针对于post请求来说:只需要将请求流的编码设置成utf-8即可 request.setCharacterEncoding("utf-8"); 域对象:request 请求转发: request.getRequestDispatcher("内部路径").forward(request,response); request生命周期: 一次请求扩展:封装数据: apache的BeanUtils 1.导入两个jar包 2.调用 BeanUtils.populate(Object bean,map);