一、概念:
- Servlet是JavaWeb的三大组件之一。三大组件是:Servlet程序,Filter过滤器,Listenter监听器
- 可以把servlet称为web应用中的控制器,能处理客户端请求并作出响应的一套技术标准就是servlet。
- Tomcat内部封装了servlet,也就是servlet接口并不是JDK自带的接口,而是Tomcat里jar包提供的api,所以添加maven中无需添加依赖。
二、servlet开发:
2.1. 新建项目,添加依赖
转换为web项目后,配置好Tomcat的依赖:这步骤需要先做,不然后先新建类无法使用servlet相关api。
2.2. 新建一个类,并新建一个index.html,内容随意
继承HttpServlet类,重写service方法;或者实现Servlet接口,重写service方法,由于我们只关注service方法,所以采用继承的方式。
index.html的内容可以如下:
2.3. 配置Tomcat启动器
启动后默认访问蓝色点的web包下的index.html,如果启动后显示404无法找到资源,编译文件中也没有资源,则需要进行如下设置
2.4.web.xml配置文件
作用:该配置文件可用@webservlet替代,xml配置目的用于将请求路径和java类做关联,请求可以通过后端代码,也就是Tomcat。
问题:service方法为一个实例方法,Tomcat会自动调用service方法,拿Tomcat是如何找到该方法的呢?
回答:通过配置xml中的全路径即可,也就是字节码的位置,再通过反射调用这个service方法。
<!--
<servlet-name>该标签是起别名的作用,为<servlet-mapping>标签找到对应的<servlet>
<servlet-class>为Tomcat找到该类的位置
<url-pattern>处理哪种路径可经过UserServlet这个类
-->
<servlet>
<servlet-name>userServlet</servlet-name>
<servlet-class>com.samcode.servlet.UserServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>userServlet</servlet-name>
<url-pattern>/user</url-pattern>
</servlet-mapping>
2.5. UserServlet类可以简化为下面这种写法,无需配置web.xml文件
@WebServlet("/user")
public class UserServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws IOException, ServletException {
String username = req.getParameter("username");
if (username.equalsIgnoreCase("abc")) {
resp.getWriter().println("Welcome " + username);
}
//转发至jsp页面
RequestDispatcher dispatcher = req.getRequestDispatcher("/index.jsp");
dispatcher.forward(req, resp);
}
}
2.6. 最终效果图
2.7. 访问流程
三、servlet一些重要的api
3.1. servletContext
- servletContext是最大的域对象,可以为所有的servlet提供配置参数
- servletContext还可以为查询项目中的一些路径。
3.1.1. servletContext配置相关:
例如web.xml有如下配置
<context-param>
<param-name>driver</param-name>
<param-value>com.mysql.jdbc.Driver</param-value></context-param>
继承HttpServlet,可以调用其父类的方法getServletContext
@WebServlet("/user")
public class UserServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws IOException, ServletException {
ServletContext servletContext = super.getServletContext();
String driver = servletContext.getInitParameter("driver");
System.out.println(driver);
// 结果为:com.mysql.jdbc.Driver
}
}
3.1.2. servletContext路径相关:
四、servlet的生命周期
1.执行Servlet构造方法
2.执行init初始化方法,第一次访问时初始化
3.执行service方法(每次请求都会调用)
4.执行destroy销毁方法
某一个类实现servlet接口,重写即可有上述四个方法
五、Servlet相关的类
5.1.Servlet接口中,有子接口HttpServletRequest,子类中可以获取请求方式
5.2.继承HttpServlet,重写方法
5.3.HttpServletRequest类
5.3.1.概念:
只要有请求进入Tomcar服务器,Tomcat服务器就会把Http请求协议解析到request对象中,然后传递到Service方法(doGet 和 doPost中)
常用方法:
5.3.2.转发对象,设置域数据
使用setAttribute可以在请求中设置数据,再用getArrtibute获取,设置的域数据在使用转发
5.3.3. servlet1转发到servlet2
5.3.4.乱码问题
在doPost方法中,如果传入的参数中带有中文,则会出现乱码,可以使用rep.setCharacterEncoding("utf-8")解决乱码。
api说明中可以看到是请求体中的参数
5.4.HttpServletResponse类
5.4.1. 只要有请求进入Tomcar服务器,Tomcat服务器就会创建一个response对象传递给Servlet程序去使用。HttpServlet Response表示所有响应信息。
5.4.2. 字节流 getOutputStream(); 常用于下载(二进制文件)
5.4.3. 字符流 getWreter(); 常用于回传字符串
在响应中不可同时使用字节和字符流。