Servlet
一、servlet介绍
1. 是什么?
servlet是一个java类。服务器端小程序。
2. servlet与jsp关系
3. servlet处理流程
servlet 与servlet容器
- javaweb组件包括servlet和jsp,运行在servlet容器中。servlet实现与数据库的通信。
- 静态页面放在文件系统中。
- 动态请求和静态请求都会发给server,由server返回clinet的浏览器。
二、servlet程序
1. servlet程序的类的继承关系
自定义的类,根据协议,继承Genericservlet的子类。
- Genericservlet是一个通用的类。
- Httpservlet是实现http协议的类。是抽象类,继承时要实现他的方法。
HttpServlet类提供Servlet类的一般框架。
任何一个server类必须继承httpservlet父类。
类的继承关系:
2.servlet的组成
1、定义一个servlet必须继承HttpServlet类。
2、任何一个servlet必须重写父类的以下任意一个方法doGet(),doPost(),doPut(),doDelete(),init(),getServletInfo()
3、处理客户请求最常用的方法是doGet() 和doPost()
开发可以处理http请求的servlet程序:
- 继承HttpServlet类
- 在自定义的servlet类中至少要复写Httpservlet类中提供的doGet()方法
2.1 编写类文件:HelloWorldServlet
类文件不能直接运行,要部署在tomcat中。
import javax.servlet.\*;
import javax.servlet.http.\*;
这两个包属于java扩展包,在JavaEE开发包中,不在JDK中。
他们在tomcat的jar包中(servlet-api.jar中包含这两个包)
2.2 部署到tomcat环境中
- web.xml配置文件:拷一个,添加映射配置
<servlet>
<servlet-name> hello </servlet-name> servlet名字
<servlet-class> com.org.HelloWorldServlet </servlet-class> servlet类名字:引用完整的包
</servlet>
<servlet-mapping> 如何访问?
<servlet-name> hello </servlet-name> 对这个servlet进行配置
<url-pattern> /HelloServlet </url-pattern> 访问的名字
</servlet-mapping>
2.3 启动Tomcat服务
2.4 访问 localhost:8080/myapp/HelloServlet
访问网页:get请求。调用servlet的doget()方法,执行doget()方法的代码。
3. servlet 2.5
3.1 创建 Dynamic web项目
3.2 新建servlet
3.3 web.xml
3.4 运行
run as --> run on server
3.5 访问
4. servlet 3.1
4.1 创建Dynamic web项目
4.2 新建servlet
4.3 注解’@WebServlet("/Myservlet3")'代替web.xml
https://blog.youkuaiyun.com/lanseliuxingluo/article/details/80222074
4.4 运行
run as --> run on server
4.5 访问
5. servlet2.X 与servlet3.X 版本区别
6. 访问方法
7. 映射
三、servlet与表单
httpservlet 的请求与响应
1. 响应:getWriter()+println
2. 请求
get:以查询字符串的方式附在url后面
post:不可见,注册、登陆
2.1 get方法:getParameter(String name) ,直接在地址栏中请求servlet
例子:
2.2 post方式:调用doget()
以4开头的状态码:与客户端有关的错误
404:请求路径出错或不存在
表单:
action:server 、处理资源路径
method:请求方法,默认get,可省略
post方法:
看不到传递的请求参数:
html分文件夹管理
回跳上级目录:
跳回上一级目录:
3 doXXX方法
四、 servlet生命周期
1 生命周期
生命周期:生存周期
servlet受容器管理,由容器决定servlet生命周期。
2 各生命周期作用
只有处理服务的方法会被反复调用,其他均调用一次。
servlet以多线程的方式处理客户请求,每一个客户请求处理方法会运行在一个线程中。
3 servlet生命周期对应的方法
-
了解service()方法和doGet()、doPost()方法的区别 。
service() 方法是 Servlet 的核心。
每当一个客户请求一个HttpServlet 对象,该对象的service() 方法就要被调用,而且传递给这个方法一个"请求"(ServletRequest)对象和一个"响应"(ServletResponse)对象作为参数。
在 HttpServlet 中已存在 service()方法.缺省的服务功能是调用与 HTTP 请求的方法相应的 do 功能。 -
例如,如果 HTTP 请求方法为 GET,则缺省情况下就调用 doGet()。
service方法是接口中的方法,Servlet容器把所有请求发送到该方法,该方法默认行为是转发http请求到doXXX方法中,如果你重载了该方法,默认操作被覆盖,不再进行转发操作!
Servlet 应该为 Servlet 支持的 HTTP 方法覆盖 do 功能.因为HttpServlet.service() 方法会检查请求方法是否调用了适当的处理方法,不必要覆盖 service() 方法。只需覆盖相应的 do 方法就可以了。
我们也需要把Servlet做成既能处理GET请求,也能够处理POST请求(eg:Servlet要处理GET和POST两种请求),这只需要在doPost方法中调用doGet方法。
4 验证生命周期
修改映射:
重启服务
刷新页面:刷新一次,服务调用一次
点击shutdown.bat:
随后关闭。
service()方法
- 如果重写service方法将不再调用doget和dopost方法。service方法是生命周期方法。
service方法根据请求决定调用doget或dopost方法。所以一般都是重写doget和dopost方法。
init()方法
- 在第一次访问时调用
- 通过配置web.xml文件在容器启动时自动初始化,通过配置文件完成
直接配置启动选择:
启动时自动加载servlet完成初始化
五、中文乱码
1. 常见字符集
计算机处理二进制,用二进制表示字符。
字符集:字符编码集合。
2.中文乱码原因
字符转化时没有对应字符就会出现乱码
3. 解决中文乱码
3.1 服务器返回页面中文乱码问题 : setContentType()
- 例子:
要放在获得输出流之前:
3.2 解决 post 乱码: setCharacterEncoding()
- 例子:
- 解决:放在获取参数之前
3.3 解决 get 乱码(修改配置文件)
- 例子
- 解决
关闭Tomcat
改为:
- 验证:
六、servlet例子–用户登录验证(post+乱码处理)
1. 登陆流程
获取登陆页面(html页面)–> 信息提交验证(servlet) --> 返回验证结果
2. 实现功能
2.1 创建页面、首页
login.html
- form表单 :两个输入框+一个按钮
- bootstrap前端框架使页面更美观。
login.html代码:
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "https://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<link href="bootstrap/css/bootstrap.min.css" rel="stylesheet">
<link href="css/signin.css" rel="stylesheet">
<script src="jquery/jquery-1.9.1.min.js"></script>
<script src="bootstrap/js/bootstrap.min.js"></script>
<title>登录</title>
</head>
<body>
<div class="container">
<form class="form-signin" action="LoginServlet" method="post">
<h2 class="form-signin-heading">请登录</h2>
<label for="inputUsername" class="sr-only">用户名</label>
<input type="text" id="username" name="username" class="form-control" placeholder="用户名" required autofocus>
<label for="inputPassword" class="sr-only">密码</label>
<input type="password" id="password" name="password" class="form-control" placeholder="密码" required>
<div class="checkbox">
<label>
<input type="checkbox" value="remember-me"> Remember me
</label>
</div>
<button class="btn btn-lg btn-primary btn-block" type="submit">登录</button>
</form>
</div> <!-- /container -->
</body>
</html>
2.2 servlet 验证
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Servlet implementation class LoginServlet
*/
@WebServlet("/LoginServlet")
public class LoginServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
public LoginServlet() {
super();
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8"); //设置服务器返回页面编码方式
request.setCharacterEncoding("UTF-8"); //解决Post方式请求中文参数乱码
//接收提交过来的用户名和密码
String username = request.getParameter("username");
String password = request.getParameter("password");
if(username.equals("javaweb") && password.equals("abc123")) {
response.getWriter().write("welcome,"+username);
}else {
response.getWriter().write("sorry,your username or password is wrong.");
}
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
3 测试