1.什么是servelt
servlet是运行在web服务器上的小型java程序,就是服务器的小型应用程序,servlet通过http接收和响应来自web客户端的请求
1.1首先写一个servlet
public class ServletDemo1 implements Servlet {
//接收用户请求,并且做出响应
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
servletResponse.getWriter().write("hello servletdemo");
}
}
web.xml
<servlet>
<servlet-name>ServletDemo1</servlet-name>
<servlet-class>com.servlet.ServletDemo1</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ServletDemo1</servlet-name>
<url-pattern>/demo1</url-pattern>
</servlet-mapping>
访问路径为:localhost:8080/项目名/demo1
2.执行过程
3.servlet生命周期
出生:init 启动服务器或者客户机首次访问servlet的时候装入servlet不管有多少客户机访问都只会执行一次
服务:service 响应客户请求,当一个客户请求一个httpservlet对象,这个对象的service方法就要调用 传递一个servletrequest和serveltresponse对象为参数
死亡:destory 当服务端停止并且卸载servlet应用的时候,也只会执行一次
<load-on-startup>2</<load-on-startup>
是否应该在web应用启动时候就加载这个servlet,实例化并且调用init方法
必须是一个整数,若是负数和不设置---servlet请求时候再加载
若是正数和0-----应用启动就开始加载并且初始化,值越小优先级越高 越优先加载 相同的时候容器会进行自主选
举个例子把:servlet1优先级为1 servlet2优先级2
构造函数1 init1 构造函数2 init2 销毁2 销毁
4.servelt的三种创造方式
4.1implements servlet接口
4.2extends GenericServlet
4.3extends HttpServlet
servlet >GenericServlet>HttpServlet
doGet()和doPost()方法的区别
通过get方法提交的数据有大小限制1024 ,post则没有,
通过get传输数据key -value会跟在url后面来达到传送目的,而post传输数据没有明文显示
post一般用于表单提交 get用<a href="" > <frame src="" >
偷懒在doGet中写代码,在doPost中调用doGet;
5.servlet的映射细节
<url-pattern>必须保证唯一,用/作为开头
支持通配符映射:
/*
*拓展名 *.do
绝对匹配> /开头匹配 > 扩展名方式匹配
在映射servlet的时间<servlet-name>元素的文本内容不能是default,default是专门处理静态资源
<servlet>
<servlet-name>default</servlet-name>
<servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>
</servlet>
6.servlet的线程安全
单实例:每次访问多线程
解决线程安全问题的最佳方法是写局部变量
7.Servlet获取配置信息
7.1servletConfig:getInitParamters()
<servlet>
<servlet-name>ServletDemo2</servlet-name>
<servlet-class>com.servlet.ServletDemo2</servlet-class>
<init-param>
<param-name>encoding</param-name>
<param-value>GBK</param-value>
</init-param>
</servlet>
@Override
public void init(ServletConfig config) throws ServletException {
this.config=config;
}
String value=config.getInitParameter("encoding");//此对象由服务器创建
String value=this.getServletConfig().getInitParameter("encoding");
String value=super.getInitParameter("encoding");//使用继承父类的方法得到servletConfig对象
7.2servletContext
servletContext代表着一整个实例,一个应用只有一个ServletContext对象,单个实例,多个servlet共享数据
setAttibute(name,value)
getAttibute(name,value)
moveAttibute(name,value)
7.2.1获取全局配置信息
<context-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</context-param>
String value=this.getServletContext().getInitParameter("encoding");
System.out.println(value);
7.2.2获取资源路径
getRealPath()
读取properties文件
String path=this.getServletContext().getRealPath("/WEB-INF/classes/com/servlet/a.properties");
Properties properties=new Properties();
properties.load(new FileInputStream(path));
System.out.println(properties.get("key"));
7.2.3转发
getRequestDispatcher()
转发到另一个servlet执行了里面的方法,然后还要回到原先请求转发的servlet中,所以url的地址不发生变化
servlet2:
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("这个事情我办不了");
ServletContext servletContext=this.getServletContext();
servletContext.getRequestDispatcher("/demo3").forward(req,resp);
System.out.println("事情办完了");
}
servlet3:
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("还是要找我办");
}
结果:http://localhost:8080/servletdemo/demo2
这个事情我办不了
还是要找我办
事情办完了