servlet超详细笔记

 

1. 引言

Servlet是一种小型的Java程序,它扩展了Web服务器的功能。(作用:收集数据,处理请求,跳转页面)

 

2. 创建

详见代码

 

3. 路径

<url-pattern>/demo</url-pattern>

注意:1.url-pattern中的路径前面必须加/*

2.优先级:精确匹配优先级最高,模糊匹配次之。模糊匹配中*.xxx优先级最低。

A. 精确匹配路径前加 /

配置:<url-pattern>/demo</url-pattern>

Url:http://localhost:8080/day10ee/demo

B. 模糊匹配 * (通配符)

配置:<url-pattern>/demo/*</url-pattern>

Url:http://localhost:8080/day10ee/demo/(后面任意)

 

配置:<url-pattern>/*</url-pattern>

<url-pattern>/</url-pattern>

Url:http://localhost:8080/day10ee/demo/(后面任意)

 

配置:<url-pattern>*.html</url-pattern>(伪静态)

Url:http://localhost:8080/day10ee/(任意).html

 

配置:<url-pattern>/demo/*.html</url-pattern> //错误:语法错误

 

4. Servlet访问过程

例如:Url:http://localhost:8080/day10ee/index.html

1. 根据localhosthost文件中找到本地回环地址(127.0.0.1

2. 根据8080找到tomcat

3. webapps找到day10ee项目

4. 在项目的web.xml中找有没有匹配/index.htmlurl-pattern

如果找到了,则根据映射找到ServletClass

如果没找到呢?

没找到则找服务器中的缺省Servlet(默认Servlet,缺省Servlet会在静态资源中查找资源,如找到则将资源返回给浏览器,如没找到,则将404页面返回给浏览器。

 

 

 

 

 

5. Servlet生命周期(对象从创建到销毁的过程)

生命周期方法

public void init(ServletConfig config)

public void service(ServletRequest arg0, ServletResponse arg1)

public void destroy()

 

当第一次访问Servlet时,创建对象并初始化,之后每次访问只执行service(),

当服务器关闭时,调用destroy()

 

注:Servlet对象是单例的。

 

/**

 * 如果需要给Servlet进行初始化,使用无参的init()

 */

@Override

public void init() throws ServletException {}

 

#提前加载Servlet

因为第一次访问Servlet时,才创建对象,所有第一次加载Servlet较慢,为了提高效率,可以在访问之前创建对象(在服务器启动时创建对象)

在当前Servlet的配置中添加配置

 <load-on-startup>1</load-on-startup>   //数字越大优先级越低。

 

6. Servlet线程安全问题

 

因为Servlet是单例的,多个线程访问该Servlet时,如果使用了共享数据,且多条语句操作该数据,那么+可能产生安全问题,为解决此问题,建议使用同步代码块,将涉及安全问题的语句包起来。

 

7. ServletConfig

 

ServletConfig:当前servlet的配置对象,在其他Servlet中不能得到该Servlet的配置信息。

 

#获取ServletConfig对象

// 得到当前Servlet的配置对象

ServletConfig config = this.getServletConfig();

 

#常用方法

//根据参数名得到参数值

config.getInitParameter("path");

//得到所有参数名

config.getInitParameterNames();

//得到当前Servlet的名字

config.getServletName();

//得到ServletContext对象的方法

config.getServletContext();

 

8. ServletContext

 

理解:Servlet上下文对象。它会为每个WEB应用程序都创建一个对应的ServletContext对象,它代表当前web应用。

 

#创建对象

 

A. //获取ServletContext对象

ServletContext context = this.getServletContext();

 

B. //获取全局配置信息

//根据参数名得到参数值

context.getInitParameter("path");

//得到所有参数名

context.getInitParameterNames();

 

C. //获取当前应用名称

String path = context.getContextPath();

 

D. //作为域对象使用

//域对象可以保存数据读取数据,可以在不同的动态资源中共享数据.

//保存数据

//context.setAttribute(arg0, arg1)

//读取数据

//context.getAttribute(arg0)

//删除数据

//context.removeAttribute(arg0)

 

共享数据方式1

//使用?传值(仿get提交)

//缺点:不能传递实体

res.sendRedirect("day10web/context1?name=lisi");

 

共享数据方式2

//使用域对象

保存

Student stu = new Student("list",21);

context.setAttribute("student", stu);

res.sendRedirect("/day10web/context1");

获取

ServletContext context = this.getServletContext();

Object obj = context.getAttribute("student");

if(obj!=null){

Student stu = (Student)obj;

System.out.println("name="+stu.getName()+

",age="+stu.getAge());

}

 

E. 转发

//处理转发  只要是当前web应用程序内,可以转发到Servlethtml

RequestDispatcher dis = context.getRequestDispatcher("/context1");

dis.forward(req, res);

//简写如下

//context.getRequestDispatcher("/context1").forward(req, res);

 

转发和重定向的区别:

转发:

A) 地址栏内容不改变

B) 转发时会将请求和响应数据转到新的资源中。

C) 只能转发到当前web应用程序中。(地址不需要加项目名)

 

重定向:

A) 地址栏内容改变

B) 重定向时请求为新的请求

C) 能重定向到当前web中或其他web中,或互联网中的资源。(地址需要加项目名)

 

8. 常用域对象(作用域不同)

ServletContext

HttpServletRequest//转发时使用,使用方法同ServletContext

HttpSession

PageContext

 

 

 

/**

 * JspWriter PrintWriter区别:

 * PrintWriter相当于一个字节输出流对象

 * JspWriter是带有缓冲区的PrintWriter

 *

 */

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值