Servlet基础
1.Servlet简介
Servlet = Server + let 服务器小应用程序
本质是一个Java类,该Servlet类的实例实现由tomcat容器负责创建并管理
Servlet类似生活中餐厅的服务员
- Servlet的定义:
Servlet是一个Java程序,是驻留在服务器端,运行以处理客户端请求并做出响应的程序
- 创建Servlet类,必须满足以下两个条件
(1) 定义类,继承JavaEE --> javax.servlet.http.HttpServlet类 [抽象类]
(2) 重定父类HttpServlet中的两个方法: doGet(),doPost()
|-关注这两个方法的参数:
HttpServletRequest request -封装客户端请求信息的对象
HttpServletResponse response -封装响应输出对象
- Servlet作用
其功能就是动态地生成网页,接收用户发送的请求和数据,然后根据这些请求和数据访问数据库等其它应用程序,最后将产生的结果以HTML格式的页面返回给客户端
- 创建自定义Servlet类
maven项目需要添加servlet与jsp的api依赖
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>javax.servlet.jsp-api</artifactId>
<version>2.3.3</version>
</dependency>
HelloServlet类:
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class HelloServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("请求到达HelloServlet中的doGet()....");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("请求到达HelloServlet中的doPost()....");
}
}
2.Servlet配置与运行
如果前台浏览端需要访问 java web应用中的后台Servlet程序,则必须先配置Servlet的映射名称类似,在医院挂号
- 配置Servlet有两种方式
方式一:使用web.xml
<servlet>
<servlet-name>HelloServlet</servlet-name>
<!--反射机制,动态加载该类实例-->
<servlet-class>com.woniu.servlet.HelloServlet</servlet-class>
</servlet>
<!--Servlet映射-->
<servlet-mapping>
<servlet-name>HelloServlet</servlet-name>
<!--指定在浏览器地址栏请求地址描述-->
<url-pattern>/hello</url-pattern>
</servlet-mapping>
方式二:注解方式
@WebServlet({"/hello","/aaa","/bbb"})
public class HelloServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("请求到达HelloServlet中的doGet()....");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("请求到达HelloServlet中的doPost()....");
}
}
注:如果启动Tomcat报错:
Invalid <url-pattern> [hello] in servlet mapping
都是由于url-pattern掉了/,必须以/开头
Servlet接收请求参数
演示以超链接和表单分别发送请求参数
- 超链接
<body>
这是a.jsp<hr>
<a href="hello?name=jack&age=20">请求Servlet</a><br>
<form action="hello">
姓名:<input type="text" name="name"><br>
年龄:<input type="text" name="age"><br>
<input type="submit" value="提交" />
</form>
</body>
- 表单
@WebServlet("/hello")
public class HelloServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("请求到达HelloServlet中的doGet()....");
//接收请求参数
String name = request.getParameter("name"); //如果拿不到,则为null
int age = Integer.parseInt(request.getParameter("age"));
System.out.println("收到了客户端的请求参数:"+name+","+age);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("请求到达HelloServlet中的doPost()....");
}
}
4.Servlet输出响应信息(有两处问题)
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("请求到达HelloServlet中的doGet()....");
//接收请求参数
String name = request.getParameter("name"); //如果拿不到,则为null
int age = Integer.parseInt(request.getParameter("age"));
System.out.println("收到了客户端的请求参数:"+name+","+age);
//向客户端浏览器输出消息
PrintWriter out = response.getWriter();
out.println("<html>");
out.println("<head><title>A Servlet</title></head>");
out.println("<body>");
out.println("Hello,"+name+","+age);
out.println("</body>");
out.println("</html>");
//释放资源
out.flush();
out.close();
}
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("请求到达HelloServlet中的doPost()....");
this.doGet(req,resp); //调用doGet()
}
问题1: Servlet 接收请求参数
如果是Get方式,中文不是乱码[由Tomcat版本决定],但如果post方式,则是乱码
问题2: Servlet 使用response.getWritter()输出中文乱码
Hello,寮犱笁,23
5.乱码解决
在Servlet处理请求与响应过程中,会遇到中文乱码问题
由于客户端与服务端传递数据默认的字符集编码为ISO-8859-1纯英文编码,不支持中文
客户端-->服务端
get:
Tomcat7.x 以前,需要设置字符集编码
<!--针对于get方式参数字符集-->
<uriEncoding>UTF-8</uriEncoding>
如果是Tomcat8.x,9.x 则不需要设置,默认为UTF-8
post:
request.setCharacterEncoding("UTF-8");
//注:此行代码必须在所有getParmeter()之前
服务端 --> 客户端
//注:要放在response.getWriter()之前
response.setContentType("text/html;charset=UTF-8");
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~