Servlet 02
Servlet 生命周期 *****
一个Servlet对象 , 从创建到被内存释放的过程, 我们称其为Servlet的生命周期!
Servlet创建时机:
默认情况下, 当用户第一次请求此Servlet时, Servlet被创建
Servlet销毁时机:
服务器关闭 或 应用被卸载时关闭
在HttpServlet类中, 生命周期存在三个方法的体现:
1. init方法, 当Servlet对象被创建后, 会调用init方法, 用于初始化一些资源 !
2. service方法 , 当被调用时, 表示对象正在处理请求, 准备响应!
3. destroy方法 , 当Servlet即将被释放时, 调用此方法 ,用于释放资源,结束子线程等等操作 !
修改Servlet 启动时机 (类似单例模式的懒汉变饿汉)
在web.xml中的 servlet节点中 加入子节点:
<load-on-startup>填入整数</load-on-startup>
整数的含义:
- 负数 : 默认值, 表示第一次被访问时, 创建对象
- 正数 : 表示服务器启动时, 就创建对象, 值越小优先级越高, 相同值按照web.xml自上至下顺序加载 !
- 0 : 与正数相同, 表示值为max的正数 (服务器启动时创建 ,但是是最后一个创建)
常见的URL后缀:
.html 网页文件
.php PHP动态网页文件
.jsp Java动态网页文件
.do struts1 建议使用的URL结尾
.action struts2 建议使用的URL结尾
doGet方法 与 doPost方法
与service方法, 作用相同:
当用户请求为GET请求时, 执行doGET方法
当用户请求为post请求时, 执行doPost方法
常见的请求方式
超链接点击 - GET请求
网址中输入 - GET请求
JS中window.location操作 - GET请求
表单提交method=GET - GET请求
ajax请求方式设置为GET - GET请求
------------------------------------------------
表单提交method=POST - POST请求
ajax请求方式设置为POST - POST请求
如何接收 请求中的参数 ****
1. 接收单个参数
String value = request.getParameter(String key);
2. 接收一组相同key的参数
String[] values = request.getParameterValues(String key);
案例:
HTML部分:
<h3>用户登录</h3>
<form action="s4.do" method="POST">
<input placeholder="请输入账号" name="uname"><br><br>
<input placeholder="请输入密码" name="upass" type="password"><br><br>
选择你的性别:
<p>
<input type="checkbox" value="1" name="sex"> 男
<input type="checkbox" value="2" name="sex"> 女
<input type="checkbox" value="3" name="sex"> 妖
<input type="checkbox" value="4" name="sex"> 奇男
</p>
<input type="submit" value="登录">
</form>
Java部分:
@WebServlet("/s4.do")
public class day_02 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
//获取账号
String uname = request.getParameter("uname");
//获取密码
String upass = request.getParameter("upass");
//获取一组性别
String[] sexs = request.getParameterValues("sex");
System.out.println("账号:"+uname);
System.out.println("密码:"+upass);
System.out.println("性别组:"+Arrays.toString(sexs));
if("qinan".equals(uname)) {
//登录失败
response.getWriter().append("很遗憾, 你的账号因为涉嫌传播不良信息 , 被拉黑了 ! <a href='http://shuidianshuisb.com'>不服点这里</a> ");
}else {
//登录成功
response.getWriter().append("恭喜你, "+uname+"登陆成功了");
}
}
乱码问题
请求参数乱码问题: ***
tomcat8版本的新特性:
在tomcat8版本, 官方修复了GET请求乱码的问题, GET请求编码更改为了自适应, 适应URL编码 !
POST请求 因为可以很方便的对于请求体进行编码设置, 所以没有做任何的更新 !
出现原因:
浏览器 与 tomcat 使用了不同的编码, 导致了乱码的问题发生 !
解决方案1:
适用于tomcat所有版本, 可以用于GET请求乱码问题, POST请求乱码问题 .
解决的原理: 将乱码的数据, 打碎后, 重新按照正确编码组成 !
格式:
步骤1. 将乱码文字 , 按照ISO-8859-1编码, 转换为字节数组
byte[] bytes = 乱码文字.getBytes("ISO-8859-1");
步骤2. 将字节数组, 按照UTF-8编码重新组装 !
String text = new String(bytes,"UTF-8");
解决方案2:
仅适用于POST请求的乱码问题, 用于设置请求体的编码 !
格式:
request.setCharacterEncoding("UTF-8");//代码必须出现在接收参数之前
响应时, 乱码的问题 ***
方式1.
设置响应的内容类型为网页, 设置响应的内容编码为UTF-8
格式: response.setContentType("text/html;charset=utf-8");
方式2. ***
设置响应的内容类型为UTF-8 (注意: 可能通过浏览器打开 ,依然为乱码,原因是浏览器无法将其正确解析)
格式: response.setCharacterEncoding("UTF-8");