Servlet
概述:
Servlet Applet 服务器上的一个小程序, 主要是用来生成动态的web资源
servlet 通常通过 HTTP(超文本传输协议)接收和响应来自 Web 客户端的请求。
要实现此接口,可以编写一个扩展 javax.servlet.GenericServlet 的一般 servlet,或者编写一个扩展 javax.servlet.http.HttpServlet 的 HTTP servlet。此接口定义了初始化 servlet 的方法init()、为请求提供服务的方法service()和从服务器移除 servlet 的方法destroy()。这些方法称为生命周期方法,它们是按以下顺序调用的:
- 构造 servlet,然后使用 init 方法将其初始化。(第一次访问的时候执行,如果没有配置在web.xml中配置load-on-startup参数,就是调用了某个servlet的时候它的init()函数才会执行,如果配置了load-on-startup的话,就是在服务器启动的时候,自动执行init()函数。)
- 处理来自客户端的对 service 方法的所有调用。(每次访问的时候执行)
- 从服务中取出 servlet,然后使用 destroy 方法销毁它,最后进行垃圾回收并终止它。
除了生命周期方法之外,此接口还提供了 getServletConfig 方法和 getServletInfo 方法,servlet 可使用前一种方法获得任何启动信息,而后一种方法允许 servlet 返回有关其自身的基本信息,比如作者、版本和版权。
Servlet接口里面的5个重要的方法。
servlet的体系结构:
HttpServlet中两个service,可以通过查看源码知道,其实执行的时候,从父类继承来的service()方法是调用了子类的service(HttpServletRequest,HttpServletResponse)方法的。所以无论如何都会执行子类的service方法的。而子类的方法里面有两个方法doGet()方法和doPost()方法,其实本质上在执行的时候就是执行doget()方法,可以自己new一个servlet类继承HttpServlet接口就可以看出来了。
servlet的生命周期:初始化方法init():第一次访问的时候才会调用
服务的方法service():每次访问的时候都会调用
销毁的方法destroy():服务器正常关闭,或者工程从服务器中移除的时候调用、
servlet中的一些api(方法):
servlet中获取请求参数和输出内容:
- request.getParameter(String name) 从请求对象中获取到参数
response.getWriter().println(String msg) 向页面中获取参数
详细:
servlet请求对象
- getParameter(String name),从请求对象中获取参数 以 String 形式返回请求参数的值,如果该参数不存在,则返回
null。请求参数是与请求一起发送的额外信息。对于 HTTP servlet,参数包含在查询字符串或发送的表单数据中。
//获取请求参数
String username = request.getParameter("username");
String password = request.getParameter("password");
ServletResponse
servlet响应对象
getWriter() throws java.io.IOException向页面输出内容
返回可将字符文本发送到客户端的 PrintWriter 对象。PrintWriter 使用 #getCharacterEncoding 返回的字符编码。如果未如 getCharacterEncoding 中所述指定响应的字符编码(即该方法只返回默认值 ISO-8859-1),则 getWriter 会将字符编码更新到 ISO-8859-1。
如:
response.getWriter().println("")
response.getWriter().write("please comfirm your information……");
url-pattern的配置:
- 完全匹配:以/开头
目录匹配:以/开头,以*结尾
后缀名匹配: .jsp,.action,.do,.xxx
优先级:完全匹配 > 目录匹配 > 后缀名匹配
一个Servlet可以对应多个路径
一个路径只能够对应一个Servlet
启动参数:
load-on-startup,在启动服务器的时候的时候自动进行初始化,自动调用了init(servletConfig)
数字越小,优先级越高 (一般系统的是1,所以最好自定义的就从2开始好了)
例如,在servers中的web.xml中有一个DefaultServlet,默认就启动了。这个东西是服务于静态的资源。就是静态资源是服务器一启动的时候就加载了。。。
<servlet>
<servlet-name>LoginServlet</servlet-name>
<servlet-class>com.itheima.servlet.LoginServlet</servlet-class>
<load-on-startup>2</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>LoginServlet</servlet-name>
<url-pattern>/login</url-pattern>
</servlet-mapping>
load-on-startup是可以写在自己写的servlet里面的。控制他们的加载优先级
这样写上之后,只要在服务器启动的时候就会自动启动。
作用:比如启动定时任务,检查数据库是否存在或者检查表是否存在。
servletConfig
其中getServletContext()重要
下述语句写在servlet标签里面
web.xml:
<servlet>
<description></description>
<display-name>getServletConfigDemo</display-name>
<servlet-name>getServletConfigDemo</servlet-name>
<servlet-class>com.itheima.config.getServletConfigDemo</servlet-class>
<init-param>
<param-name>username</param-name>
<param-value>root</param-value>
</init-param>
<init-param>
<param-name>password</param-name>
<param-value>123456</param-value>
</init-param>
<load-on-startup>2</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>getServletConfigDemo</servlet-name>
<url-pattern>/config</url-pattern>
</servlet-mapping>
getServletConfigDemo:
public class getServletConfigDemo extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
ServletConfig servletConfig = this.getServletConfig();
//获取指定参数名参数
String username = servletConfig.getInitParameter("username");
System.out.println(username);
response.getWriter().write("username:"+username);
//获取所有参数名字
Enumeration<String> initParameterNames = servletConfig.getInitParameterNames();
while(initParameterNames.hasMoreElements()){
System.out.println(initParameterNames.nextElement());
}
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
servletConfig中最重要的是getServletContext()
获取上下文/全局上下文/全局管理者
主要作用就是用来共享servlet之间的数据
生命周期:
创建时间:服务器启动的时候就创建了
销毁时间:服务器关闭或者工程被移出的时候就销毁了
在整个应用程序中只有一个实例,保证了所有servlet用的都是相同的内容(单例设计模式)
获取方法:this.getServletContext();
这个方法本质上还是调用this.getServletConfig().getServletContext();
作用:
1)获取全局初始化参数
2)实现资源共享
3)获取资源路径
4)获取文件的mime类型。
5)获取绝对路径
6)获取流
实现资源共享:servletContext
xxxAttribute;
setAttribute(key,value)
getAttribute(key)
removeAttribute(key)
@Override
public void init() throws ServletException {
//获取上下文Context
ServletContext servletContext = this.getServletContext();
servletContext.setAttribute("count", 0);
System.out.println("LoginServlet执行了");
};
ServletContext
获取文件的mime类型:ServletContext.getMimeType();
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
ServletContext servletContext = this.getServletContext();
String f1 = "test.jpg";
String mimeType = servletContext.getMimeType(f1);
System.out.println(mimeType);
}
获取文件的绝对路径:
注意:文件要放在webContent文件夹下
这里要说一下,这个路径其实是从工程下的Web-Content开始写的路径。
ServletContext servletContext = this.getServletContext();
String realPath = servletContext.getRealPath("/aaa.txt");
System.out.println(realPath);
将一个文件读取到一个流中:
ServletContext servletContext = this.getServletContext();
InputStream resourceAsStream = servletContext.getResourceAsStream("/aaa.txt");
System.out.println(resourceAsStream);
配置默认工程的默认主页:
web.xml中:
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
重定向:
//重定向
response.setStatus(302);
response.setHeader("location", "/Day15_0622_03MyLoginDemo/successLogin");
MD5加密
不可逆的加密算法
处理中文乱码问题:
unicode其实就是utf-8
如果是在servlet类中:具有response的类中:
//防止中文乱码
response.setCharacterEncoding("utf-8");
response.setHeader("Content-type", "text/html;charset=utf-8");
或
response.setContentType("text/html;charset=utf-8");
重点api:
getInitParameter(String name) 根据指定名称获取全局/局部初始化参数!调用函数的对象不同,获取的参数就是全局和局部的
用servletContext对象调用的就是全局的,用servletConfig对象调用的就是局部的参数
getInitParameterNames();
全局初始化参数:
例:
<context-param> //全局配置 Context 服务器启动的时候加载配置
<param-name>TestContextParam</param-name>
<param-value>ContextParam01</param-value>
</context-param>
<servlet> //servlet内部的配置 调用了某个Servlet的时候它的配置才执行。
<description></description>
<display-name>TestServletConfig</display-name>
<servlet-name>TestServletConfig</servlet-name>
<servlet-class>com.itheima.servletConfig.TestServletConfig</servlet-class>
<init-param>
<param-name>testInitParam</param-name>
<param-value>InitParam01</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>TestServletConfig</servlet-name>
<url-pattern>/test</url-pattern>
</servlet-mapping>
在servlet类中:
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获取全局配置
ServletContext servletContext = this.getServletContext();
String initParameter = servletContext.getInitParameter("TestContextParam");
System.out.println("get ContextParam:"+initParameter);
//获取局部配置
ServletConfig servletConfig = this.getServletConfig();
String initParameter2 = servletConfig.getInitParameter("TestServletConfig");
System.out.println("get ServletConfig"+initParameter2);
}
javaEE经典三层架构:
servlet:控制服务流程
service:服务业务
dao:dao操作数据库