Servlet
一.Servlet介绍
Servlet是运行在服务器上的程序,接收客户端的请求,并做出响应
二.编写Servlet程序
1.创建web项目
点击创建
如果main目录下没有java文件夹,需要手动创建java文件夹
2.引入依赖
<dependencies>
<!-- 引入servlet依赖 -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
</dependency>
<!-- 引入jsp依赖 -->
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>javax.servlet.jsp-api</artifactId>
<version>2.3.1</version>
</dependency>
</dependencies>
3.编写Servlet
- 不推荐使用实现接口的方式,需要实现的方法太多,有些在开发中是用不上的
- 推荐使用继承HttpServlet类的方式
- 重写doGet或doPost方法
- 浏览器发送get请求,就重写doGet方法
- 浏览器发送post请求,就重写doPost方法
- 在doGet方法或doPost方法中编写响应内容
4.配置Servlet和前端请求路径的映射
推荐使用注解的方式进行配置,使用WebServlet注解
完整代码
@WebServlet("/hello")
public class Demo01Servlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("第一个Servlet程序");
// 响应成功后跳转的页面
resp.sendRedirect("/ok.jsp");
}
}
5.部署
idea整合Tomcat
点击右上的Current File
点击左上角的加号,选择Tomcat Server,如果使用自己本机的Tomcat就选择Local
在Application Server中配置自己的Tomcat
在VM options中添加-Dfile.encoding=UTF-8,可以防止控制台输入Tomcat信息时中文乱码
切换到Deployment选项卡中,点击+号,选择Artifact…
选择自己的项目, 选第一个或者第二个
Application context中的内容最好删掉,否则浏览器访问的时候端口号之后必须带上里面的内容
点击OK,idea上方会显示服务器的信息
6.运行
点击上方的箭头
控制台会输出Tomcat启动信息
启动成功后会自动弹出浏览器
此时在浏览器中输入访问路径 localhost:8080/hello
斜杠后的内容就是WebServlet注解中配置的内容
页面跳转到ok.jsp,说明响应成功
7.其他
7.1主页设置
Servlet的主页默认是webapp目录下的index.jsp
可以在WEB-INF文件夹中的web.xml中自定义主页
添加welcome-file-list标签,在标签中添加welcome-file标签,标签中可以自定义主页
<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd" >
<web-app>
<display-name>Archetype Created Web Application</display-name>
<welcome-file-list>
<welcome-file>/index.jsp</welcome-file>
</welcome-file-list>
</web-app>
7.2Tomcat启动后不自动启动浏览器
在Tomcat配置页面中将After launch勾选去掉
7.3 请求内容或响应内容中文乱码
使用HttpServletRequest中的setCharacterEncoding方法,参数写UTF-8
使用HttpServletResponse中的setContentType方法,参数写text/html;charset=utf-8
@WebServlet("/hello")
public class Demo01Servlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("第一个Servlet程序");
req.setCharacterEncoding("UTF-8");
resp.setContentType("text/html;charset=utf-8");
// 响应成功后跳转的页面
resp.sendRedirect("/ok.jsp");
}
}
三.请求转发和重定向
1.请求转发跳转页面
req.getRequestDispatcher("请求转发的与页面/Servlet请求名称").forward(req, resp);
@WebServlet("/hello")
public class Demo01Servlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("第一个Servlet程序");
req.setCharacterEncoding("UTF-8");
resp.setContentType("text/html;charset=utf-8");
// 响应成功后跳转的页面
req.getRequestDispatcher("/ok.jsp").forward(req, resp);
}
}
getRequestDispatcher中既可以写跳转的页面,也可以写Servlet请求的名称
req.getRequestDispatcher("/show/user").forward(req, resp);
两个Servlet请求转发时,可以使用请求域传递数据
使用req.setAttribute(key,value),这样就可以将数据存储在请求对象
在另一个Servlet中使用req.getAttribute(key)接收数据
@WebServlet("/hello")
public class Demo01Servlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("第一个Servlet程序");
req.setCharacterEncoding("UTF-8");
resp.setContentType("text/html;charset=utf-8");
// 使用请求域向另一个请求传递数据
req.setAttribute("username", "Sigewinne");
// 响应成功后跳转的页面
req.getRequestDispatcher("user").forward(req, resp);
}
}
@WebServlet("/user")
public class Demo02Servlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String username = (String) req.getAttribute("username");
System.out.println("username = " + username);
}
}
访问hello之后,user这个Servlet接收到了username这条数据
2.重定向
重定向也可以跳转Servlet,也可以跳转页面(功能和请求转发类似)
resp.sendRedirect("user");
上面的示例使用重定向完成
@WebServlet("/hello")
public class Demo01Servlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("第一个Servlet程序");
req.setCharacterEncoding("UTF-8");
resp.setContentType("text/html;charset=utf-8");
// 使用请求域向另一个请求传递数据
req.setAttribute("username", "Sigewinne");
// 响应成功后跳转的页面
resp.sendRedirect("user");
}
}
@WebServlet("/user")
public class Demo02Servlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String username = (String) req.getAttribute("username");
System.out.println("username = " + username);
}
}
执行结果
发现另一个请求并没有接收到数据
3.区别
- 请求转发
- 服务器端操作:请求转发是在服务器内完成的,客户端浏览器的地址栏不变
- 一次请求:整个过程对客户端来说发起了一次请求
- 可以传递数据:可以通过请求域向对方传递数据
- 性能较高:因为是在服务器内部进行操作,所以效率较高
- 重定向
-
客户端操作:重定向是由服务器发送一个状态码(通常是302)和一个新的URL到客户端,客户端根据新的URL发起新的请求
-
两次请求:客户端会看到两次请求,地址栏的URL会换成新的URL
-
不可以传递数据:由于是客户端重新发起请求,所以不能和服务端共享数据
-
性能较低:因为涉及到客户端的二次请求,所以性能较低
-
一次请求:整个过程对客户端来说发起了一次请求
-
可以传递数据:可以通过请求域向对方传递数据
-
性能较高:因为是在服务器内部进行操作,所以效率较高
-
- 重定向
- 客户端操作:重定向是由服务器发送一个状态码(通常是302)和一个新的URL到客户端,客户端根据新的URL发起新的请求
- 两次请求:客户端会看到两次请求,地址栏的URL会换成新的URL
- 不可以传递数据:由于是客户端重新发起请求,所以不能和服务端共享数据
- 性能较低:因为涉及到客户端的二次请求,所以性能较低