Servlet入门
servlet入门
获取参数
获取信息
<form action="add" method="post"> <!-- 通过post方式进行发送,发给add(add知识一个代号) -->
名称: <input type="text" name="fname"/><br/>
价格: <input type="text" name="price"/><br/>
库存: <input type="text" name="foount"/><br/>
备注: <input type="text" name="remark"/><br/>
<button>添加</button>
</form>
把表单中的所有信息通过 post 方式( methods 属性 )发送给服务器,add 对应一个 java 类-> AddServlet sever 服务器,let 小应用程序
1.获取用户(客户端)发给我的数据
2.通过调用方法完成添加功能
3.在控制台打印添加成功
jdbc 与数据库进行交互存储信息
add 相关类信息要新建在 src 文件夹下面
普通的类还不能够获取用户发来的数据,要去继承 HttpServlet
HttpServlet 不在 JDK 包中,在 tomcat\lib\servlet-api.jar 中,可以通过导入 jar 包或添加 tomcat 依赖实现
参数1 request
客户端发送请求:HttpRequest
获取信息使用 request.getParameter() 函数,获取到的信息只能是字符串,可以使用强转
package com.ppqppl.servlets;
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 AddServlet extends HttpServlet {
@Override
//doPost是从父类中调用来的。使用protected,使用public也可以,即 >=
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //响应post请求
// super.doPost(req, resp);
// getParameter()就是获取参数
String fname = new String(request.getParameter("fname").getBytes("iso-8859-1"), "utf-8"); //解决从网页传回中文乱码的情况
String priceStr = request.getParameter("price");
Integer price = Integer.parseInt(priceStr);
String fcountStr = request.getParameter("fcount");
Integer fcount = Integer.parseInt(fcountStr);
String remark = request.getParameter("remark"); //从网页传回是用的时 iso-8859-1 编码,所以会生成乱码
System.out.println("fname = "+fname);
System.out.println("price = "+price);
System.out.println("fcount = "+fcount);
System.out.println("remark = "+remark);
System.out.println("乱码测试");
//网页输入中文终端输出时会乱码
}
}
配置对应关系
在web.xml中进行设置
<servlet>
<!-- 名称可以随便写,但是类名要进行对应,一个 servlet 可以对应多个 servlet-mapping -->
<servlet-name>AddServlet</servlet-name>
<servlet-class>com.ppqppl.servlets.AddServlet</servlet-class>
</servlet>
<!-- 映射,发出请求和接受请求的名称要进行一一对应,一个 servlet-mapping 只能对应一个 servlet -->
<servlet-mapping>
<servlet-name>AddServlet</servlet-name>
<url-pattern>/add</url-pattern>
</servlet-mapping>
//或者直接如下:
@WebServlet("/add") // Servlet 从 3.0 版本开始支持注解方式注册,可以直接不使用 web.xml 文件,但是 thymeleaf 中有些配置要写到里面
具体流程如下:
1.用户发请求:action = add
2.项目中,web.xml中找到url-patten = /add
3.找到servlet-name = AddServlet
4.找和servlet-mapping中servlet-name一致的servlet
5.找到servlet-class -> com.ppqppl.servlets.AddServlet
6.用户发送的是post请求(method = post),因此tomcat或执行AddServlet中的doPost方法
请求add.html -> 服务器给出响应 Http Request -> 看到表单,输入数据点击添加 ->数据发给服务器 action=add method=post ->
服务器中组件 add 在 web.xml 中与 AddServlet 对应 -> 经过三个步骤->重写doPost方法
处理请求参数中文乱码
设置编码
由于tomcat底层编码为 "ISO-8859-1",所以有些输入后进行获取会产生乱码
我们就需要将其转换为 "UTF-8" 编码进行输出
Post
post方式下设置编码,防止中文乱码
注意:设置编码代码行必须放在多有的获取参数动作之前,否则就算设置了,还会产生所有中文都是乱码的情况
requset.setCharacterEncoding("UTF-8");
还可以使用这句代码,但是比较麻烦,需要每获取一个值就转换一次
String fname = new String(request.getParameter("fname").getBytes("iso-8859-1"), "utf-8");
Get
get方式先不需要设置编码(基于 tomcat8 ),如果使用 tomcat8 (不包括)之前的版本,就要注意设置编码
1.将字符串打散成字节数组
2.即将字节数组按设定的编码重新组装成字符串
String fname = request.getParameter("fname");
byte[] bytes = fname.getBytes("ISO-8859-1"); // 先转为 bytes
fname = new String (bytes,"UTF-8"); // 再从 bytes 转回 sting
继承关系
继承关系
Servlet接口:
实现类-> javax.servlet.GenericServlet 抽象类:
子类-> javax.servlet.http.HttpServlet 基于Http协议,是GenericServlet下的一个抽象子类,源码如下:
public abstract class HttpServlet extends GenericServlet(){
}
相关方法
javax.servlet.Servlet 接口:
void init(config) - 初始化方法
void service(request,response) - 服务方法:
当客户端发送了请求,无论是表单还是点槽连接,service方法会自动被调用执行
void destory()
javax.servlet.GenericServlet 抽象类
void service(request,response) - 仍然是抽象的
javax.servlet.http.HttpServlet 抽象子类
void service(request,response) - 不是抽象的
1.String method = req.getMethod(); 获取请求的方式(总共有8个):GET,POST,PUT,DELETE,OPTIONS,TRACE,CONNECT,HEAD
2.各种 if 判断,根据请求方式不同,决定去调用不同的do方法
if (method.equals("GET")) {
lastModified = this.getLastModified(req);
if (lastModified == -1L) {
this.doGet(req, resp);
} else {
long ifModifiedSince;
try {
ifModifiedSince = req.getDateHeader("If-Modified-Since");
} catch (IllegalArgumentException var9) {
ifModifiedSince = -1L;
}
if (ifModifiedSince < lastModified / 1000L * 1000L) {
this.maybeSetLastModified(resp, lastModified);
this.doGet(req, resp);
} else {
resp.setStatus(304);
}
}
} else if (method.equals("HEAD")) {
lastModified = this.getLastModified(req);
this.maybeSetLastModified(resp, lastModified);
this.doHead(req, resp);
} else if (method.equals("POST")) {
this.doPost(req, resp);
} else if (method.equals("PUT")) {
this.doPut(req, resp);
} else if (method.equals("DELETE")) {
this.doDelete(req, resp);
} else if (method.equals("OPTIONS")) {
this.doOptions(req, resp);
} else if (method.equals("TRACE")) {
this.doTrace(req, resp);
} else {
String errMsg = lStrings.getString("http.method_not_implemented");
Object[] errArgs = new Object[]{method};
errMsg = MessageFormat.format(errMsg, errArgs);
resp.sendError(501, errMsg);
}
3.在HttpServlet抽象类中,do方法基本相似
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String msg = lStrings.getString("http.method_get_not_supported");
this.sendMethodNotAllowed(req, resp, msg);
}
没有写 doGet,会去调用父类中的 doGet 方法,其实调用的是 this.doGet,然后按曾寻找,显示报错msg
小结
- 继承关系:HttpServlet -> GenericServlet -> Servlet
- Servlet 中的核心方法 init()、service()、destory()
- 服务方法( service 方法):当有请求过来时,service方法会自动相应(其实是 tomcat 容器调用的)
在 HttpServlet 中我们会分析请求的方式:是 get、post、head 还是 delete 等
然后再决定调用的 do 开头的执行方法
那么在 HttpServlet 中这些 do 方法默认都是 405 的实现风格 - 要我们子类去实现( 重写 )对应的方法,否则直接默认报错 405
父类中方的 do 方法默认是报错 405,如果没有重写,则默认调用父类 do 方法 - 因此,我们在新建 Servlet 时,我们才会去考虑请求方法,从而决定重写哪种 do 方法