Servlet技术2
配置servlet
配置方式一:精确配置
<url-pattern>/别名</url-pattern>
注意:
"/"是必须声明的,别名不可以为中文
此种配置方式可以配置多个
配置方式二:模糊配置
<url-pattern>*.后缀名</url-pattern>
注意:
*表示任意个数的任意字符
所有以指定的后缀名结尾的请求都会调用该servlet进行处理
作用:
进行模块化开发的划分等
配置方式三:拦截所有请求
<url-pattern>/*</url-pattern>
注意:
会拦截所有类型的请求,包括静态资源请求(css、js、图片等)和jsp请求。
配置方式四:
<url-pattern>/one/*</url-pattern>
注意:
会拦截处理所有Servlet的别名以one开头的路径的请求
注意:
- 一个Servlet可以配置多个url-pattern
- 不同的Servlet不允许配置相同的url-pattern,如果配置了在服务器启动的时候就会报错。
- 服务器启动的时候就会将部署的项目中的web.xml文件加载进内存。
- 每次打开tomcat服务器后,服务器就会自动加载曾经部署过的项目(只要没在服务器中移除),会占用大量资源,拖慢启动时间,建议在用过以后移除。方法如下
Servlet的生命周期:
从第一次被调用到服务器关闭
- init方法 :servlet被初始化创建的时候调用(和service同时执行)
- service方法:处理请求的时候
- destory方法 :servlet被销毁的时候。
- 当服务器关闭的时候销毁servlet,触发destroy方法的执行
注意:
我们可以在web.xml中配置load-on-startup来设置Servlet的加载时机为服务器启动。 生命周期就变为从服务器开启到服务器关闭(init在servlet加载时调用)
Get与Post方式区别:
doGet(HttpServletRequest req, HttpServletResponse resp)
特点:处理get方式的请求。
doPost(HttpServletRequest req, HttpServletResponse resp)
特点:处理post方式的请求
service(HttpServletRequest req, HttpServletResponse resp)
特点:无论是什么类型的请求方式,服务器都会优先执行service方法。
注意:
servlet中没有声明service方法,会根据请求方式调用对应的方法进行请求处理, 如果在servlet中没有声明对应的请求处理方法,则会报405错误。
特别注意
tomcat服务器其实只认识service方法,如果我们自己声明的servlet中没有覆写service方法,则会执行HttpServlet中的service方法,而HttpServlet中的service方法会根据请求方法调用对应的doXX()方法执行请求处理。
request对象之获取请求数据
请求数据:
请求行:请求方式 请求URL 协议
getMethod(); 返回请求方式
getRequestUrl(); 返回请求url
getRequestUri(); 返回请求uri
getQueryString(); 返回get请求中的URL中的用户数据 注意:post请求中没有此方法。
getSchema(); 返回协议
请求头
getHeader(String name) 根据键名获取请求头信息
getHeaderNames() 返回存储了请求头键名的枚举集合。
注意:如果获取的请求头信息不存在返回null
请求实体
getParameter(String name) 根据键名获取数据,一般来说是通过表单的name属性获取其值。
注意: 键名其实就是前端页面中的表单标签的name属性的值或者前端页面其他方式提交数据的键的名字。 如果请求中没有对应的请求数据,则返回null.
getParameterValues(String name) 根据键名获取同名不同的值,返回数组
注意:如果没有对应的键名,则返回null
getParameterNames() 返回实体数据中键名的枚举
getRemoteAddr() 获取客户端的IP地址
getRemotePort() 获取客户端端口号
getLocalAddr() 获取服务器端的ip
getLocalPort() 获取服务器端的端口号
response对象之处理响应:
设置响应行: 协议 状态码 状态消息
resp.sendError(int status);
作用:可以自主的响应状态给浏览器
设置响应头
addHeader(String name,String value) 添加响应头信息,同名数据不会覆盖
setHeader(String nanme,String value) 设置响应头信息,会覆盖原有信息。如果没有此响应头则添加该信息。
设置响应实体(处理结果)
resp.getWriter().write("实体内容");
注意: 实体内容可以分开进行响应。 一旦使用resp对象作出了请求响应,则意味着此次请求处理完毕。服务器在响应后会将此次请求相关的req对象和resp对象销毁。
请求乱码问题:服务器获取的请求数据乱码
post请求方式乱码:
req.setCharacterEncoding("utf-8");
get请求方式乱码解决:
方式一:每个数据都要单独的进行转换
String uname=req.getParameter("uname");
String uname2=new String(uname.getBytes("iso-8859-1"), "utf-8");
方式二:
req.setCharacterEncoding("utf-8");
在tomcat的server.xml文件中的Connector标签中增加属性: useBodyEncodingForURI="true"
响应乱码问题:浏览器中显示的服务器响应数据乱码
resp.setContentType("text/html;charset=utf-8");
到此为止:service代码编写流程:
设置请求编码格式 设置响应编码格式 获取请求信息 处理请求信息 响应处理结果(三种方式不一定都需要) ------直接响应 ------请求转发 ------重定向
session学习:
问题:
用户不同的请求在处理的时候需要使用其他请求中的数据该怎么办?
解决:
session技术
使用:
创建session对象
HttpSession session =req.getSession();
存储数据到session中
session.setAttribute(String name, Object value);
获取session对象
HttpSession session =req.getSession();
获取session中的数据
session.getAttribute(String uname);注意:返回的object类型,需要强制转换
删除session中的数据
session.removeAttribute(String uname);注意:如果有数据则删除,没有则什么都不做。
session创建过程:
1、 浏览器发起请求到A servlet,在A Servlet中使用req.getSession()获取Session对象,如果此次请求中没有SessionID,则创建一个新的Session对象,如果有SessionID则将其对应的Session对象返回(前提是该session对象没有到期),如果session对象到期销毁了,就算有sessionID也会重新创建一个Session。 2、 校验session是否失效,存储数据到session对象中或者获取session中的数据或者删除session中的数据
特点:
session解决了同一个用户不同请求的数据共享问题。 session的作用域:浏览器不关闭,session不失效,则同一用户的任意请求获取的都是同一个session中的对象
session的设置:
session默认有效时间为30分钟,如果需要修改可以在tomcat下的web.xml中进行配置
注意:
此种配置方式是所有的tomcat下的项目默认为30分钟,也可以在代码中使用
session.setMaxInactiveInterval(int seconds);//设置session的有效时间,参数为整数类型的秒
session.invalidate();//强制销毁session
ServletContext对象:
作用:
解决了不同用户之间的数据共享问题
使用:
创建ServletContext对象
ServletContext sc1 = this.getServletContext();
ServletContext sc2 =this.getServletConfig().getServletContext();
ServletContext sc3=req.getSession().getServletContext();
存储用户共享数据
sc.setAttribute(String name,Object value);
获取用户共享数据
sc.getAttribute(String name);
删除共享数据
sc.removeAttribute(String name);
获取web.xml中的全局配置属性,作用:将部分动作和源文件进行解耦,我们只需要在xml配置文件中进行相关配置就会改变代码的执行效果。
sc.getInitParameter(String name);注意返回的是String类型数据
获取webRoot下的资源流对象
sc.getResourceAsStream(String path);
注意:
path为相对路径,写从webRoot开始查找资源的路径即可。
获取webRoot下的资源绝对路径
sc.getRealPath(String path);
注意:
path为相对路径,写从webRoot开始查找资源的路径即可。
特点:
服务器创建;所有用户共享
生命周期:
服务器开启到服务器关闭
ps:
1、通过web.xml配置全局属性(每个servlet都能使用)
2、通过ServletConfig对象配置局部属性(专属每个servlet)
- C++ 使用STL string 实现的split,trim,replace-修订
- 跟着柴毛毛学Spring(1)——纵观Spring
- MYSQL常用SQL汇总
- Linux 下设置SVN DIFF
- 剑指 offer代码解析——面试题38数字在排序数组中出现的次数
- 剑指 offer代码解析——面试题37两个链表的第一个公共结点
- 剑指 offer代码解析——面试题34丑数
- 剑指 offer代码解析——面试题35第一个只出现一次的字符
- Python内置数据结构之集合
- 剑指 offer代码解析——面试题32统计1到n中1出现的次数
- 剑指 offer代码解析——面试题26复杂链表的复制
- Linux软件安装(二)——RPM与YUM
- linux软件安装(一)——源码安装
- 利用LUA协程实现FUTURE模式
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- laravel框架中控制器的创建和使用方法分析
- php 使用expat方式解析xml文件操作示例
- laravel利用中间件做防非法登录和权限控制示例
- laravel框架中表单请求类型和CSRF防护实例分析
- Yii框架getter与setter方法功能与用法分析
- laravel框架中视图的基本使用方法分析
- laravel5 Eloquent 实现事务方式
- Laravel 微信小程序后端搭建步骤详解
- Laravel使用swoole实现websocket主动消息推送的方法介绍
- Laravel框架Eloquent ORM删除数据操作示例
- PHP常用函数之base64图片上传功能详解
- laravel-admin 实现在指定的相册下添加照片
- Laravel框架Eloquent ORM修改数据操作示例
- PHP常用函数之格式化时间操作示例
- 在phpstudy集成环境下的nginx服务器下配置url重写