servlet
添加依赖坐标(maven)
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
</dependency>
小测试
所有请求都会固定携带一个参数(method)代表请求的方式(GET,POST,PUT,DELETE,OPTION)
public class HelloServlet extends HttpServlet {
@Override
// req 对应的是请求对象,代表的是请求
// resp 对应的是响应对象,代表的是响应
// Java依然按照面向对象的设计方式,开发者如果想操作请求和响应,只需要使用对应的对象调用方法即可,对象实例化也是由 tomcat 自行完成
// 此方法表示处理的是 get 请求,如果发送的 post 请求,那么网页就会报错405
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 通过响应对象,设置响应内容
// 准备响应内容
String content = "This is a text content!";
// 获取响应对应的输出流,和 socket 变成的流的获取类似
PrintWriter printWriter = resp.getWriter();
// 将数据读取到输出流中
printWriter.write(content);
// 当doGet方法运行完成之后,响应会被 tomcat 自动返回给客户端
}
}
// 在 web.xml 文件中配置路由
<servlet>
<servlet-name>HelloServlet</servlet-name>
<servlet-class>com.iweb.servlet.HelloServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>HelloServlet</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
一个post请求的全流程
<!--页面代码-->
<body>
<!--action:点击提交按钮的时候所发送的请求路径-->
<!--method:请求方式,如果不写默认get-->
<form action="login" method="post">
用户名:<input type="text" name="username"><br>
密码:<input type="password" name="password"><br>
<input type="submit" value="提交">
</form>
</body>
// 服务端代码
public class LoginServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 中文处理:在请求的参数接受之前,设置请求中的参数的字符串
req.setCharacterEncoding("UTF-8");
// 借助请求对象,获取form表单中所对应的参数
// getParameter对应的参数,是form表单中input所对应的name属性
String username = req.getParameter("username");
String password = req.getParameter("password");
// req.getParameterValues("name") 获取多个值
System.out.println(username + " : " + password);
String html = "";
if("admin".equals(username)&& "123".equals(password)){
html = "<div style='color:red'>login success!</div>";
}else{
html = "<div style='color:green'>login failed!</div>";
}
// 在响应返回之前,设置响应中的内容类型和指定字符集编码
// 1. 在Java层面将想用中的字符设置为UTF-8编码
// 2. 通知浏览器使用UTF-8编码显示数据
resp.setContentType("text/html;charset=UTF-8");
// 响应返回
resp.getWriter().write(html);
}
}
<!--web.xml-->
<servlet>
<servlet-name>LoginServlet</servlet-name>
<servlet-class>com.iweb.servlet.LoginServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>LoginServlet</servlet-name>
<url-pattern>/login</url-pattern>
</servlet-mapping>
Get请求的几种情况
- 浏览器地址栏输入地址访问
- 通过超链接点击发送的请求方式
- form表单的默认提交方式
- ajax指定get方式发送的请求
Post请求方式
- form表单指定post方式提交
- ajax指定post方式发送请求
POST 和 GET 的区别
- get 请求匹配 doGet 方法,post请求匹配 doPost 方法,如果不匹配,会出现405
- post 请求中如果携带参数,参数不会出现在 url 中,get 请求中如果携带参数,参数会出现在 url 中
- get 请求中参数大小是有限的,过大的参数无法携带,port 请求中参数大小远大于 get 方式
servlet生命周期
-
实例化(特性:延迟加载,单例)
tomcat 运行的时候,servlet 并不会立刻实例化,直到有用户发送请求,并且根据 web.xml 中所配置的映射关系,找到了对应的 servlet 类的类路径的时候,tomcat 这个时候会利用反射创建出对应 servlet 类的对象,为了保证效率,servlet类是单例的。
-
初始化
init方法来自于从HttpServlet 的继承,该方法是成员方法,所以一定是在实例化之后调用的,会在构造方法运行之后运行,但是无论访问多少次,Servlet init,只会初始化一次。
-
提供服务
正常执行 Service 方法,开发者在方法中借助 req 和 resp 进行请求和响应的处理,方法运行结束之后,响应自动返回
-
销毁
tomcat 服务器关闭的时候,destory 方法被调用。这个过程不是很直观的能被观察到
-
被回收
servlet 被销毁之后,不再有引用存储实例的内存地址,这个时候,servlet实例就满足了被 GC 回收的条件
// 重写方法观察生命周期
public class HelloServlet extends HttpServlet {
public HelloServlet() {
System.out.println("HelloServlet -> HelloServlet()");
}
@Override
public void init() throws ServletException {
System.out.println("HelloServlet -> init()");
}
@Override
public void destroy() {
System.out.println("HelloServlet -> destroy()");
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 通过响应对象,设置响应内容
// 准备响应内容
String content = "This is a text content!";
// 获取响应对应的输出流,和 socket 变成的流的获取类似
PrintWriter printWriter = resp.getWriter();
// 将数据读取到输出流中
printWriter.write(content);
// 当doGet方法运行完成之后,响应会被 tomcat 自动返回给客户端
// 定义 url 映射,让服务器知道客户端发送的哪一个请求,会由当前 servlet 处理
}
}
CDN快速构建前端页面
布局网站:https://www.runoob.com/try/bootstrap/layoutit/
<link href="//cdn.bootcss.com/bootstrap/3.3.5/css/bootstrap.min.css" rel="stylesheet">
<script src="//cdn.bootcss.com/jquery/2.1.4/jquery.min.js"></script>
<script src="//cdn.bootcss.com/bootstrap/3.3.5/js/bootstrap.min.js"></script>
页面跳转(至静态页面)
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 模拟页面跳转
// 通过转发方式跳转到指定页面(或者发送指定请求)
req.getRequestDispatcher("页面文件路径").forward(req,resp);
// 通过重定向方式跳转到指定页面(或者发送指定请求)
req.sendRedicrect("页面文件路径");
}
转发和重定向的区别:转发是一次请求(将请求资源直接发送给客户端),重定向是两次请求(通知客户端去访问资源),如果用户访问的资源不可以被直接获取,那么重定向可以判断该用户有没有权限获得这些资源,转发并不可以,转发则是可以保护页面资源,因为不知道该页面是从何而来文章来源:https://www.toymoban.com/news/detail-601981.html
servlet自启动(通过注解去启动servlet)
一般在自启动的servlet类中配置init方法,可以在tomcat启动的时候,该servlet类会自动被实例化以及初始化,但是并不会调用service文章来源地址https://www.toymoban.com/news/detail-601981.html
@WebServlet(loadOnStartup = 10)
// 取值范围为1-99 值越大,优先级越低,反之值越小,优先级越高
req,resp常用方法
req常用方法
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 浏览器发送请求时候的完整url,包括协议,主机名,端口号
System.out.println(req.getRequestURL());
// 将url去除掉协议和主机名,并输出(上下文,访问资源路径)
System.out.println(req.getRequestURI());
// 获取请求中的参数数据,也就是 ? 之后的信息,只能获取GET方式请求的参数,无法获取POST
System.out.println(req.getQueryString());
// 获取客户端的ip地址
System.out.println(req.getRemoteAddr());
// 获取客户端的主机名
System.out.println(req.getRemoteHost());
// 获取服务器端自己的ip地址
System.out.println(req.getLocalAddr());
// 获取服务器端自己的主机名
System.out.println(req.getLocalName());
// 获取客户端返送请求的请求方式
System.out.println(req.getMethod());
}
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 接收单个值的参数
System.out.println(req.getParameter("jerk"));
// 接收多值参数
System.out.println(Arrays.asList(req.getParameterValues("hobby")));
// 使用ParamMap进行参数和参数值的读取,其中该Map的Key类型为String,值类型为String[]
Map<String,String[]> params = req.getParameterMap();
Set<String> paramNames = params.keySet();
for (String name : paramNames) {
String[] value = params.get(name);
System.out.println(name + " : " + Arrays.asList(value));
}
}
到了这里,关于Java后端01(初识servlet)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!