Servlet是JavaWeb的 三大组件之一 ,它属于动态资源。Servlet的作用是处理请求,服务器会把接收到的请求交给Servlet来处理,在Servlet中通常需要:
接收请求数据;
处理请求;
完成响应。
实现javax.servlet.Servlet接口
public class BServlet implements Servlet { @Override public void init(ServletConfig servletConfig) throws ServletException { } @Override public ServletConfig getServletConfig() { return null; } @Override public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException { //得到请求参数 String username = servletRequest.getParameter("username"); String age = servletRequest.getParameter("age"); //System.out.println("username:"+username); //System.out.println("age:"+age); //得到响应输出流 // 写js脚本 //servletResponse.getWriter().print("hello client
"); if(username != null && username.equals("张三")){ //跳转到index.html 使用js脚本 location.href 赋一个url, 实现页面跳转 servletResponse.getWriter().print(""); }else{ servletResponse.getWriter().print(""); } } @Override public String getServletInfo() { return null; } @Override public void destroy() { } }
继承javax.servlet.GenericServlet抽象类
public class CServlet extends GenericServlet { @Override public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException { servletResponse.getWriter().print("CServlet...."); } }
继承javax.servlet.http.HttpServlet抽象类 实际开发中使用这种方式
/** * 实现Servlet的第三种方式, 继承HttpServlet */ // name 忽略: //@WebServlet(name="DServlet",urlPatterns="/DServlet") //@WebServlet(urlPatterns="/DServlet") //urlPatterns 与value 等同 //@WebServlet(value="/DServlet") // 如果只给value赋值, 省略 value= @WebServlet("/DServlet") public class DServlet extends HttpServlet { //处理get请求 @Override protected void doGet( HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { resp.getWriter().print("DServlet...."); } //处理post请求 @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { } }
在WEB-INF/web.xml文件中进行配置(老方法)
- <servlet>
-
- <servlet-name>AServletservlet-name>
-
- <servlet-class>com.fs.web.AServletservlet-class>
- servlet>
- <servlet-mapping>
-
- <servlet-name>AServletservlet-name>
-
- <url-pattern>/AServleturl-pattern>
- servlet-mapping>
描述Servelet的一生, 从生到死过程
默认情况: Servlet第一次请求的时候,由Tomcat创建
调用init()方法
用户每请求一次这个Servlet, tomcat调用一次service()方法
当Tomcat服务器关闭之前, 销毁它创建的所有对象,包含创建Servlet, 在Servlet销毁之前, 调用destroy()
1.ServletConfig 对象: 对应Servlet的配置, Tomcat创建
获取Servlet的初始化参数 参数名,参数值 都是String类型
String getInitParameter(String name) 根据初始化参数名获取初始化参数值
Enumeration
getInitParameterNames() 获取所有的初始化参数name
<servlet> <!-- 名称 随意取, 一般取名类名--> <servlet-name>AServlet</servlet-name> <!--对应的Servlet类, 全限定名(包.类名) --> <servlet-class>com.fs.web.AServlet</servlet-class> <!--配置初始化参数--> <init-param> <param-name>name</param-name> <param-value>张三</param-value> </init-param> <init-param> <param-name>age</param-name> <param-value>21</param-value> </init-param> </servlet>2.ServletContext getServletContext() 得到ServletContext , 最大域对象(Application域)
2.ServletRequest对象: 请求对象, 后面详细讲 核心 Tomcat创建
核心方法: 获取请求参数
String getParameter(String name) 根据请求参数name获取请求参数值
前端发送请求有哪些方式:
form 的action 可以是get,post method: 默认值get, 设置post,发送post请求
直接在浏览器地址栏输入url 只能get
js发送ajax请求 可以是get,post
请求方式: GET请求/POST请求
get请求: 请求参数通过url传递, 请求参数 url: url?k1=v1&k2=v2&...
不安全, 传递字符串, 不能传递文件数据
post请求: 请求参数通过请求体传递,
安全性高, 传递字符串, 传递文件数据
3.ServletResponse对象: 响应对象, 后面详细讲 核心 Tomcat创建
getWriter() 得到字符响应输出流, 服务器通过改输出流,把数据写到客户端的浏览器页面上
System.out.println(): 把数据打印到服务器的控制台
- System.out.println("AServlet 正在服务...");
- //获取Servlet配置
- //System.out.println("Servlet的名字:"+servletConfig.getServletName());
- //获取初始化参数
- //根据初始化参数名获取值
- String name = servletConfig.getInitParameter("name");
- System.out.println("name:"+name);
- //获取所有的初始化参数名
- Enumeration<String> names = servletConfig.getInitParameterNames();
- //遍历
- while(names.hasMoreElements()){
- String key = names.nextElement(); //参数名
- String value = servletConfig.getInitParameter(key);
- System.out.println("key:"+key+"--value:"+value);
- }
解: 特殊的接口, 在方法,类,属性.... @注解名 (创建注解类的对象)
类类型: class interface enum @interface
注解作用: 替换配置文件
常用!
@WebServlet注解 替换servlet的配置文件
// name 忽略: //@WebServlet(name="DServlet",urlPatterns="/DServlet") //@WebServlet(urlPatterns="/DServlet") //urlPatterns 与value 等同 //@WebServlet(value="/DServlet") // 如果只给value赋值, 省略 value= @WebServlet("/DServlet")
servlet是否是一个线程安全? 判断依据: 多个线程是否共享同一资源, 是共享, 线程不安全, 不是共享, 线程安全
AServlet类在Tomcat只有一个对象, 多个请求,请求的同一个Servlet对象, 多个线程使用的同一个对象, Servlet对象共享, 线程不安全
一定不要再Servlet提供存放数据的属性
2.Servlet的url-pattern: 给这个servlet绑定一个url
1.一个Servlet只能绑定一个Url?
可以绑定多个url, 但是实际开发一般只绑定一个
2.url-pattern的写法
/字符串 绑定确定的url
结合 * (通配符, 任意)
/user/* 前缀匹配, 只要前面是/user开头,后面的任意 /user/a /user/b
*.后缀名 后缀匹配, 只要url后面以 后缀名结尾的都匹配 *.do a.do c.do
注意: /*.后缀名 错误写法
- /* 匹配所有url的匹配, 越精确,优先级越高,
没有*的url优先级高于有*的
3.Servlet的默认创建时机: 第一次请求该Servlet才创建, 第一次惩罚, 第一次请求耗费时间多一点
修改Servlet的创建时机: 在web服务器启动的时候,创建Servlet
- <servlet>
-
- <load-on-startup>非负整数load-on-startup>
- servlet>
load-on-startup 中的数字越小,越先创建
注解:
@WebServlet(value="/*",loadOnStartup=2)
与天(tomcat)同寿
ServletContext 在Tomcat启动的时候创建, 在tomcat关闭的时候销毁, 在整个web项目中只有一个
在Web项目任何一个用户任何一个地方都可以访问
作用: 作为全局共享数据容器
称为域对象 ServletContext 称为application域
域对象作用: 存放数据,取数据, key/value对结构 key: String value:Object
javaWeb中有四大域:
application域 整个项目有效
session域 常用 在同一次会话内有效
request域 常用 在同一次请求内有效
page域 在同一个页面/Servlet有效: 等同于this
域对象都有下列方法
void setAttribute(String name,Object object) 往域中存数据, 如果name不存在,就添加,如果name存在,覆盖object
Object getAttribute(String name) 从域中获取数据, 如果name不存在, 返回null
removeAttribute(String name) 从域中删除数据
Enumeration
getAttributeNames() 获取域中所有的name