javaweb第一部分

本文详细介绍了Servlet的工作原理,包括如何实现Servlet、Servlet的生命周期、请求和响应参数的处理,以及中文乱码问题的解决。同时,讲解了Cookie的本质、在浏览器和服务器之间的传递、时效性和保存作用域。通过对Servlet和Cookie的理解,有助于提升Web应用开发的能力。
摘要由CSDN通过智能技术生成

1、Servlet

Servlet是Server Applet(服务器小程序),运行在服务器上,可以接受客户端的请求,对后台数据库进行增删改查操作,为用户提供数据服务。

1、1 如何实现Servlet

Servlet相关API

Servlet接口
GenericServlet类(实现Servlet接口)
HttpServlet类(继承GenericServlet类)

实现Servlet有三种方式

1、继承HttpServlet类

主要方法:
doGet 处理Get请求
doPost 处理POST请求
doPut …
doDelete
doTrace
doHead
doOptions
service 服务,通过请求参数,调用doXXX方法
doXXX方法都有默认实现,可以根据需要实现

2、继承GenericServlet类

主要方法:
init 进行初始化
service 抽象方法,必须实现,为用户提供服务
destroy 销毁
实现Servlet接口
主要方法:
init 初始化
service 服务
destory 销毁
getServletConfig 获取配置信息
getServletInfo 获得Servlet信息

3、实现上面所有方法

1、2 Servlet的配置

Servlet定义后,需要在服务器配置,用户才能访问到。
在web.xml配置

MyServlet com.java29.MyServlet MyServlet /MyServlet.do 调用过程:

web.xml其它的配置:

index.html 404 /404.html Servlet3.0支持,使用WebServlet注解配置 在类前面加:

@WebServlet(“/Servlet的URL”)
对比两种注册方法:

使用注解比较简单,缺点是使用硬编码方式进行注册,后面如果需要修改就需要修改源代码。
使用XML比较繁琐,优点是XML可以在网站部署后进行修改。

1、3 Servlet的生命周期

Servlet的生命周期是由服务器来进行管理的,主要的生命周期有:

实例化
用户第一次访问该Servlet类时,就会创建一个Servlet的实例,该实例保存在Tomcat中。(注意一个Servlet类只有一个实例)
默认情况下,Servlet第一次被访问时被创建
在标签下配置执行Servlet的创建时机
第一次被访问时创建
负数
1
在服务器启动时创建
0或正整数
1
初始化
init方法,用户第一次访问时,先实例化,然后初始化
服务
调用service方法,给用户提供服务,用户每访问一次,就调用一次
销毁
调用destroy方法,释放各种资源,在Tomcat关闭时调用
案例代码:

@WebServlet("/lifecircle.do")
public class LifecircleServlet extends HttpServlet{

public LifecircleServlet(){

/**

  • 测试Servlet的生命周期
    */
    System.out.println("实例化LifecircleServlet");

}

@Override
public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {

    super.service(req, res);
    System.out.println("LifecircleServlet进行服务");

}

@Override
public void destroy() {

    super.destroy();
    System.out.println("LifecircleServlet进行销毁");

}

@Override
public void init() throws ServletException {

    super.init();
    System.out.println("LifecircleServlet进行初始化");

}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

    System.out.println("LifecircleServlet调用doGet");

}

}

1、4 Servlet的请求和响应参数

service方法用于处理用户请求,参数:

HttpServletRequest 请求参数,包含请求URL、方法、参数等信息
主要方法:
String getParameter(“参数名”) 获得请求中的参数
setCharacterEncoding(“编码类型”) 设置请求的编码
getMethod() 获得请求方法类型,Get、POST…
getRequestURL() 获得请求的URL
HttpServletResponse 响应参数,给浏览器提供响应的交互
主要方法:
PrintWriter getWriter() 获得输出流,向浏览器发送信息
sendRedirect(“页面地址”) 实现页面的跳转
setCharacterEncoding(“编码类型”) 设置响应的编码
案例:Servlet接受浏览器发送的请求参数

@WebServlet(“/register.do”)
public class RegisterServlet extends HttpServlet{

@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    System.out.println("doGet");
    doPost(req,resp);
}

@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    //设置请求的编码
    req.setCharacterEncoding("UTF-8");
    //设置响应的编码
    resp.setContentType("text/html;charset=UTF-8");
    //获得请求参数
    String username = req.getParameter("username");
    //解决get提交参数的中文乱码
    //username = new String(username.getBytes("ISO-8859-1"),"UTF-8");
    String password = req.getParameter("password");
    String pid = req.getParameter("pid");
    String phone = req.getParameter("phone");
    //输出参数
    System.out.println(username+","+password+","+pid+","+phone);
    //获得响应对象的输出流
    PrintWriter pw = resp.getWriter();
    pw.println(username+"你好啊");
    pw.close();
}

}
客户端表单:

用户的注册
账号
密码
身份证号
手机号

1、5 中文乱码问题

页面或表单中包含中文,可能出现乱码。
对于不同的乱码情况,有不同的解决方法:

html页面中

1 doGet方法的请求参数 String name = req.getParameter("name"); name = new String(name.getBytes("ISO-8859-1"),"UTF-8"); 1 2 doPost方法的请求参数 req.setCharacterEncoding("UTF-8"); 1 响应对象的输出流 resp.setContentType("text/html;charset=UTF-8"); 1 JSP中 在page指令中设置pageEncoding="UTF-8" 1 Servlet的线程安全问题 Servlet是单实例多线程的,Tomcat中每一个Servlet类只会创建一个实例,不同用户访问该实例时,为了不会相互影响,Tomcat会开启子线程为每个用户进行服务。

注意:Servlet的成员变量,可能出现线程同步问题,一般情况下最好不定义成员变量,使用局部变量。

2、Cookie

2、1 Cookie介绍

1、本质
  • 在浏览器端临时存储数据
  • 键值对
  • 键和值都是字符串类型
  • 数据量很小
2、Cookie在浏览器和服务器之间的传递
[1]没有Cookie的状态

在服务器端没有创建Cookie并返回的情况下,浏览器端不会保存Cookie信息。双方在请求和响应的过程中也不会携带Cookie的数据。

[2]创建Cookie对象并返回
// 1.创建Cookie对象
Cookie cookie = new Cookie("cookie-message", "hello-cookie");
// 2.将Cookie对象添加到响应中
response.addCookie(cookie);
// 3.返回响应
processTemplate("page-target", request, response);
[3]服务器端返回Cookie的响应消息头
[4]浏览器拿到Cookie之后

浏览器拿到Cookie之后,以后的每一个请求都会携带Cookie信息。

[5]服务器端读取Cookie的信息
// 1.通过request对象获取Cookie的数组
Cookie[] cookies = request.getCookies();
// 2.遍历数组
for (Cookie cookie : cookies) {
 System.out.println("cookie.getName() = " + cookie.getName());
 System.out.println("cookie.getValue() = " + cookie.getValue());
 System.out.println();
}
3、Cookie时效性
  • 会话级Cookie
    • 服务器端并没有明确指定Cookie的存在时间
    • 在浏览器端,Cookie数据存在于内存中
    • 只要浏览器还开着,Cookie数据就一直都在
    • 浏览器关闭,内存中的Cookie数据就会被释放
  • 持久化Cookie
    • 服务器端明确设置了Cookie的存在时间
    • 在浏览器端,Cookie数据会被保存到硬盘上
    • Cookie在硬盘上存在的时间根据服务器端限定的时间来管控,不受浏览器关闭的影响
    • 持久化Cookie到达了预设的时间会被释放

3、保存作用域

1、工作机制

前提:浏览器正常访问服务器

  • 服务器端没调用request.getSession()方法:什么都不会发生
  • 服务器端调用了request.getSession()方法
    • 服务器端检查当前请求中是否携带了JSESSIONID的Cookie
      • 有:根据JSESSIONID在服务器端查找对应的HttpSession对象
        • 能找到:将找到的HttpSession对象作为request.getSession()方法的返回值返回
        • 找不到:服务器端新建一个HttpSession对象作为request.getSession()方法的返回值返回
      • 无:服务器端新建一个HttpSession对象作为request.getSession()方法的返回值返回
2、四大作用域
  • pageContext:当前页面有效 (页面跳转后无效)

  • request:同一次请求有效(请求转发后有效;重定向后无效)

  • session:同一次会话有效(关闭/切换浏览器后无效 ; 默认30分钟有效期)-

  • appliation:全局有效 (切换浏览器 仍然有效) 服务器开着就有效

以上4个作用域共有的方法:
Object getAttribute(String name): 根据属性名,获取属性值
void setAttribute(String name,Object obj): 设置属性值(新增,修改)
setAttribute(“a”,“b”) : 如果a对象之前不存在,则新建一个a对象; 如果a之前已经存在,则将a的值改为b
void removeAttribute(String name):根据属性名,删除对象
1.以上的4个范围对象,通过 setAttribute()复制,通过getAttribute()取值;
2.以上范围对象,尽量使用最小的范围。因为 对象的范围越大,造成的性能损耗越大。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值