Servlet
Serlvet开发步骤
/**
* 1、写一个类继承自HttpServet
* 2、重写父类的doget和dopost
* 3、注册Servlet(将Servlet用url地址进行映射)
*
*/
public class TestServlet extends HttpServlet{
/**
* 处理get请求的方法
*/
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("处理get请求");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("处理post请求");
}
}
web.xml配置
<!-- TestServlet的映射 注册TestServlet -->
<!--
servlet-name 给Servlet取名字
servlet-class 指明是哪一个Serlvet
-->
<servlet>
<servlet-name>test</servlet-name>
<!-- 全限定名 包名+类名 -->
<servlet-class>com.qf.servlet.TestServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>test</servlet-name>
<!--
注意: 必须有一个 /
http://localhost:8080/JavaWeb01/test
-->
<url-pattern>/test</url-pattern>
</servlet-mapping>
测试
启动项目
在地址栏输入 http://localhost:8080/你的工程名/test
Servlet的生命周期
/**
*
* Servlet的生命周期
* Servlet生命周期的方法
* 1、init()方法 Servlet初始化 当第一次访问的时候就创建Servlet
* 2、service()方法 Serlvet处理请求 每次请求都会执行service方法
*
* service方法会接收到请求,然后根据请求将请求分发给doGet方法或者是doPost方法
* 一般在开发中都是重写doGet和doPost方法
*
* 3、destory()方法 Servlet被销毁 当tomcat容器销毁的时候Serlvet也会被销毁
*
* 当客户端发送请求达到Servlet的时候,会执行init()方法,创建Servlet的对象。
* 并且执行对应doget方法或者是doPost方法,如果再次发送请求,只会执行doget方法或者是doPost方法
* 不会再创建Servlet对象,所以说Servlet是单例的(只有一个实例)
* 当tomcat服务器停止的时候,Servlet就会被销毁
*
* 启动tomca的时候,就会创建此Servlet的对象
* <load-on-startup>1</load-on-startup>
*
*/
代码实现
public class LifeServlet extends HttpServlet{
@Override
public void init() throws ServletException {
System.out.println("这是Servlet初始化的方法");
}
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("执行了方法");
}
@Override
public void destroy() {
System.out.println("这是Servlet销毁的方法");
}
}
web.xml配置
<servlet>
<servlet-name>life</servlet-name>
<servlet-class>com.qf.servlet.LifeServlet</servlet-class>
<!-- 在启动tomca的时候,就会创建此Servlet的对象-->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>life</servlet-name>
<url-pattern>/life</url-pattern>
</servlet-mapping>
Serlvet处理响应
在Servlet中处理响应,通过HttpServletResponse对象
通过resp.getWrite()获取输出流
PrintWrite out = resp.getWrite();
out.write("响应的内容");
代码实现
public class DemoServlet extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//给客户端响应
PrintWriter out = resp.getWriter();
// out.write("cxk,hello");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
web.xml配置
<servlet>
<servlet-name>demo</servlet-name>
<servlet-class>com.qf.servlet.DemoServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>demo</servlet-name>
<url-pattern>/demo</url-pattern>
</servlet-mapping>
Serlvet处理请求
在Servlet中处理请求,通过HttpServletRequest对象
方法的参数 表示的是前端页面上的name属性名
通过:req.getParameter("username");获取请求参数
代码实现
login.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>登录页面</title>
</head>
<body>
<!--
访问login.html
http://localhost:8080/JavaWeb01/login.html
访问LoginServlet
http://localhost:8080/JavaWeb01/login
-->
<form action="login" method="post">
用户名<input type="text" name="username">
密码 <input type="password" name="password">
<input type="submit" value="登录">
</form>
</body>
</html>
LoginServlet
public class LoginServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//处理请求
//1、获取请求的参数 方法的参数 表示的是前端页面上的name属性名
String username = req.getParameter("username");
String password = req.getParameter("password");
System.out.println(username);
System.out.println(password);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
web.xml配置文件
<servlet>
<servlet-name>login</servlet-name>
<servlet-class>com.qf.servlet.LoginServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>login</servlet-name>
<url-pattern>/login</url-pattern>
</servlet-mapping>
解决乱码
1、get请求 在tomcat8.5以上的版本没有乱码 ISO-8859-1
2、post请求 会乱码
//解决post请求乱码
req.setCharacterEncoding("utf-8");
3、响应会乱码
//处理响应乱码
resp.setCharacterEncoding("utf-8");
resp.setContentType("text/html;charset=utf-8");
所以以后再所有的Serlvet中先写上着三行代码
req.setCharacterEncoding("utf-8");
resp.setCharacterEncoding("utf-8");
resp.setContentType("text/html;charset=utf-8");
Servlet的跳转
/**
* Servlet中实现跳转
* 跳转指的是一个页面(Servlet)跳转到另外一个页面(Servlet)
* 跳转分为两种
* 客户端跳转(重定向) HttpServletResponse 地址栏会发生改变
不能携带数据
* resp.sendRedirect("welcome.html");
*
* 服务端跳转(请求转发) HttpServletRequest 地址栏不会发生改变
可以携带数据
* req.getRequestDispatcher("welcome.html").forward(req, resp);
*/
public class TestServlet extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//http://localhost:8080/JavaWeb02/test
//http://localhost:8080/JavaWeb02/welcome.html
//重定向到welcome.html页面
//resp.sendRedirect("welcome.html");
//Dispatcher 分发、转发
//req.getRequestDispatcher("welcome.html").forward(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
路径问题
//获取上下文路径 获取项目的路径
req.getContextPath();
路径问题总结:在重定向与转发的路径标准方式
重定向的时候 路径: req.getContextPath()+"/资源的位置"
转发的时候 路径: "/资源的位置"
重定向
// /JavaWeb02/html/welcome.html
resp.sendRedirect(req.getContextPath()+"/welcome.html");
转发
// /JavaWeb02/test/test/welcome.html
// 这里的 / 斜杠 表示WebContent路径
req.getRequestDispatcher("/welcome.html").forward(req, resp);
网友评论