servlet的两种配置访问方式

Servlet使用Web.xml配置

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1"><servlet><servlet-name>my</servlet-name><servlet-class>com.qcby.MyServlet</servlet-class><!-- 启动的优先级,数字越小越先启动 --><load-on-startup>1</load-on-startup></servlet><servlet-mapping><servlet-name>my</servlet-name><url-pattern>/myservlet</url-pattern></servlet-mapping><servlet><servlet-name>second</servlet-name><servlet-class>com.qcby.SecondServlet</servlet-class></servlet><servlet-mapping><servlet-name>second</servlet-name><url-pattern>/second</url-pattern></servlet-mapping>
</web-app>
  • url-pattern定义的匹配规则说明

精确匹配

/具体的名称

只有url路径是具体的名称的时候才会触发Servlet

后缀匹配

*.xxx

只要是以xxx结尾就匹配触发servlet

通配符匹配

/*

匹配所有请求 (在访问的时候/后边写什么都能匹配到当前的资源),能够访问到服务器上的所有资源

通配符匹配

/

匹配所有请求,能够访问到服务器上的所有资源,不包括 .jsp

  • load-on-startup:该标记用来标记这个servlet程序什么时候被加载

    1. 他的值是一个整数,表示被servlet加载的顺序
    2. 如果该标签的值是负数或者没有值,表示该servlet会被等到请求时在加载,如果设置了就会在tomcat启动时加载
    3. 如果值为正数或者0时,表示tomcat会在启动时加载该servlet,值越小,优先级越高,值相同时容器会自己选择加载顺序。

 Servlet使用注解配置(推荐)

  • @WebServlet注解常用属性

    • name:Servlet文件的名称(可选)
    • value:配置url路径,可以配置多个
      • @WebServlet(value= {"/myServlet"})//一般可以省略value直接写成@WebServlet("/myServlet")
    • urlPatterns:配置url路径,和value作用一样,不能同时使用
      • @WebServlet(urlPatterns= {"/myServlet"})
    • loadOnStartup:配置servlet的创建时机
      • @WebServlet(urlPatterns= {"/myServlet"},loadOnStartup=0)

servlet应用【重点】

request对象

是当客户端向服务器端发送请求时,服务器为本次请求创建request对象,并在调用Servlet的service方法时,将该对象传递给service方法。Request对象中封装了客户端发送过来的所有的请求数据。

  • doGet()方法接收request数据

编写html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body><form action="/SecondServlet/regist" method="get"> 用户名:<input type="text" name="username"/>密码:<input type="text" name="password"/><input type="submit" value="注册"></form>
</body>
</html>

编写doGet()方法

@WebServlet("/regist")
public class RegistServlet  extends HttpServlet{@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// TODO Auto-generated method stubString username = req.getParameter("username");String password = req.getParameter("password");System.out.println(username + " " + password);}
}
  • doPost()方法接收request数据

编写html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body><form action="/SecondServlet/regist" method="post"> 用户名:<input type="text" name="username"/>密码:<input type="text" name="password"/><input type="submit" value="注册"></form>
</body>
</html>

编写doPost()方法

@WebServlet("/regist")
public class RegistServlet  extends HttpServlet{@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// TODO Auto-generated method stubString username = req.getParameter("username");String password = req.getParameter("password");System.out.println(username + " " + password + "dopost");}
}
  • 请求乱码问题

由于request是接收来自用户的请求,服务器会根据编码格式将请求转换。服务器端默认的编码格式为ISO-8859-1(此编码不支持中文),而我们用户浏览器默认是utf-8的编码格式,所以往往会产生乱码。要想解决乱码问题,需要设置request当中的编码格式,告诉服务器以何种形式来解析数据。或者在接收到乱码以后,通过何种编码格式进行还原

方式一:request.setCharacterEncoding("UTF-8");该方法只针对POST有效(必须在接收数据之前设定)。

方式二:new String(request.getParameter(name).getBytes("ISO-8859-1"),"UTF-8"))借助String对象的方法,该种方式对任何请求有效,都是通用的。

【注意】Tomcat8以后的get请求时不会出现乱码的。

  • 转发请求【重点】

请求转发是一种服务器行为,当客户端请求到达后,服务器进行转发,此时会将请求对象进行保存,地址栏中的url地址不会发生改变,得到相应后,服务器端会将请求发送给客户端,从始至终只有一个请求发出。

request.getRequestDispatcher(url).forward(request, response);

具体实现,定义两个servlet:

@WebServlet(value="/s01")
public class Servlet01 extends HttpServlet{@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// TODO Auto-generated method stubString username  = req.getParameter("username");String password = req.getParameter("password");System.out.println("s01="+username + " " + password);// 请求跳转到Servlet02//req.getRequestDispatcher("s02").forward(req, resp);//请求发送到html页面req.getRequestDispatcher("RegistServlet.html").forward(req, resp);}
}
@WebServlet(value="/s02")
public class Servlet02 extends HttpServlet{@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// TODO Auto-generated method stubString username  = req.getParameter("username");String password = req.getParameter("password");System.out.println("s02=" + username + " " + password);}
}

运行起来我们发现s01和s02都会输出,且只是请求了一次。

  • request作用域【重点】

request表示一个请求,只要发出一个请求就会创建一个request对象,他的作用域:仅在当前请求中有效。

用处:常用于服务器间同一请求不同页面之间的参数传递,常用于表单的控制值传递。

常用的方法

request.setAttribute(String name,Object value)

设置域对象内容

request.getAttribute(String name)

获取域对象内容

request.removeAttribute(String name)

删除域对象内容

使用方式:给Servlet传值

@WebServlet("/s03")
public class Servlet03 extends HttpServlet{@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// TODO Auto-generated method stubSystem.out.println("我是03");req.setAttribute("user", "qcby");req.setAttribute("age", 18);        req.getRequestDispatcher("s04").forward(req, resp);}
}
@WebServlet("/s04")
public class Servlet04 extends HttpServlet{@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// TODO Auto-generated method stubSystem.out.println("我是04");System.out.println(req.getAttribute("user"));System.out.println(req.getAttribute("age"));}
}

访问:http://localhost:8080/SecondServlet/s03,输出结果:

response对象

  • response的主要方法 

getWriter()

获取字符流(只能相应字符串数据)

getOutputStream()

获取字节流(能相应一切数据)

getWriter()

@WebServlet("/regist")
public class RegistServlet  extends HttpServlet{@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {PrintWriter printWriter = resp.getWriter();printWriter.print("success");}
}

getOutputStream()

@WebServlet("/regist")
public class RegistServlet  extends HttpServlet{@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// TODO Auto-generated method stub// PrintWriter writer = resp.getWriter();// writer.print("success");ServletOutputStream stream  = resp.getOutputStream();stream.write("Success".getBytes());}
}

html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body><form action="/SecondServlet/regist" method="post"> 用户名:<input type="text" name="username"/>密码:<input type="text" name="password"/><input type="submit" value="注册"></form>
</body>
</html>

访问html,点击注册,后台可以看到success。

  • 响应乱码问题

浏览器与服务器传输中文数据会乱码,原因就是服务器响应数据默认采用iso8859-1码表,浏览器默认采用GBK码表,所以就会乱码。

要解决该乱码只能在服务器端告诉服务器使用一种能够支持中文的编码格式,比如UTF-8

response.setCharacterEncoding("UTF-8");

此时还只是完成了一半的工作,要保证数据的正确显示,还要指定客户端的编码方式

response.setHeader("content-type", "text/html;charset=UTF-8");

两端指定编码后,乱码就解决了,一句话:保证发送端和接收端的编码一致

以上两句话可以简化为一句话,同时指定客户端和服务器端

response.setContentType("text/html;charset=utf-8");

案例

@WebServlet(value="/s01")
public class Servlet01 extends HttpServlet{@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse response) throws ServletException, IOException {// TODO Auto-generated method stubresponse.setContentType("text/html;charset=utf-8");PrintWriter writer = response.getWriter();writer.append("<h1>你好</h1>");}
}
@WebServlet(value="/s01")
public class Servlet01 extends HttpServlet{@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse response) throws ServletException, IOException {// TODO Auto-generated method stubresponse.setContentType("text/html;charset=utf-8");ServletOutputStream outputStream = response.getOutputStream();outputStream.write("<h1>你好</h1>".getBytes());}
}
  • 重定向

重定向是一种服务器指导,客户端行为。客户端发出第一个请求,被服务器接收处理后,服务器会给客户端一个响应(一个新的地址),当客户端接收到新的请求后,会立刻马上根据服务器发送来的地址发起第二次请求。服务器接收请求并完成响应,重定向完成。

从上述描述中可以看出重定向存在两次请求,并且是客户端行为

response.sendRedirect(url); 

案例

@WebServlet("/s05")
public class Servlet05 extends HttpServlet{@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse response) throws ServletException, IOException {// TODO Auto-generated method stubSystem.out.println("我是s05");// 重定向到s06response.sendRedirect("s06"); }
}
@WebServlet("/s06")
public class Servlet06 extends HttpServlet{@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// TODO Auto-generated method stubSystem.out.println("我是s06");  }
}

当我们输入:http://localhost:8080/SecondServlet/s05,我们会返现地址栏会发生改变变成http://localhost:8080/SecondServlet/s05,打开f12我们会发现我们访问了s05和s06,并且s05页面的状态是302,目标地址是s06

请求转发和重定向的区别

请求转发(req.getRequestDispatcher().forward())

重定向(resp.sendRedirect())

一次请求,数据在request域中共享

两次请求,request域中数据不共享

服务器端行为

客户端行为

地址栏不发生改变

地址栏发送改变

转发的地址只能是该网站内的资源

重定向可以转发到任意地址(可以跨域),决定地址可以写成http://

重定向到百度

@WebServlet("/s05")
public class Servlet05 extends HttpServlet{@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse response) throws ServletException, IOException {// TODO Auto-generated method stubSystem.out.println("我是s05");// 重定向到s06response.sendRedirect("http://www.baidu.com"); }
}

Javaweb基础-servlet应用1相关推荐

  1. Javaweb基础——Servlet

    目录: 1.Servlet入门 2.我的第一个Servlet 3.继承HttpServlet类的方法来实现Servlet 4.使用IDE直接创建Servlet程序 5.Servlet的继承体系 6.S ...

  2. javaweb基础 - Servlet

    引用:Java Web(一) Servlet详解!! Servlet:处理请求和发送响应的过程是由一种叫做Servlet的程序来完成的,通过servlet可以实现动态web开发. <!-- *号 ...

  3. index加载显示servlet数据_[WEB篇]-JavaWeb基础与应用-02-Servlet开发

    JavaWeb基础与应用 2.Servlet开发 Servlet是sun公司提供的一门用于开发动态web资源的技术. Sun公司在其API中提供了一个servlet接口,用户若想用发一个动态web资源 ...

  4. javaweb利用servlet与struts2实现可点击刷新的基础图片验证码

    javaweb利用servlet实现图片验证码 验证码是登录验证的技术,可以一定程度防止恶意脚本刷网站,造成服务器压力. 具体实现思想很简单: 首先利用servlet产生一个随机的验证码, 保存在se ...

  5. 超详细的Java面试题总结(四 )之JavaWeb基础知识总结

    系列文章请查看: 超详细的Java面试题总结(一)之Java基础知识篇 超详细的Java面试题总结(二)之Java基础知识篇 超详细的Java面试题总结(三)之Java集合篇常见问题 超详细的Java ...

  6. html与java接口,JavaWeb学习——Servlet相关的接口和类

    JavaWeb学习--Servlet相关的接口和类 摘要:本文主要学习了Servlet相关的接口和类. Servlet的接口和类 三种方式 实现Servlet有三种方式: 实现javax.servle ...

  7. javaweb基础知识点记录2

    javaweb基础知识点记录 1.在service方法中,首先获得请求的方法名,然后根据方法名调用对应的doXXXX方法,比如说请求参数为GET,那么就会去调用doGet方法,请求参数为POST,那么 ...

  8. javaweb基础知识点记录1

    javaweb基础知识点记录 1.当我们通过在浏览器的输入栏中直接输入网址的方式访问网页的时候,浏览器采用的就是GET方法向服务器获取资源. 2.我们可以将Servlet看做是嵌套了HTML代码的ja ...

  9. javaweb(07) Servlet详解

    javaweb(07) Servlet详解 什么是Servlet 简介 从广义上来讲,Servlet规范是Sun公司制定的一套技术标准,包含与web应用相关的一系列接口,是web应用实现方式的宏观解决 ...

最新文章

  1. 【裴蜀定理】[HAOI2011]向量
  2. 线程共享的环境包括:进程代码段、进程的公有数据(利用这些共享的数据,线程很容易的实现相互之间的通讯)、进程打开的文件描述符、信号的处理器、进程的当前目录和进程用户ID与进程组ID。 进程拥有这
  3. 年终盘点 | 七年零故障支撑 双11 的消息中间件 RocketMQ,怎么做到的?
  4. 乡村振兴国际经验-农民丰收节贸易会: 谋定城镇化进程
  5. 图卷积神经网络_深度层次化图卷积神经网络
  6. 猛料来啦!Autodesk全线产品二次开发视频录像下载!!
  7. 存储过程批量执行脚本
  8. BPF(BSD Packet Filter)
  9. Badboy下载地址
  10. Lottie动画的优劣及原理
  11. STM32 - L4系列芯片手册: LTDC功能
  12. A Knee_Guided Evolutionary Algorithm for Compressing Deep Neural Network (KGEA)解读
  13. 如何测试app启动时间?
  14. 收藏 | 堪称神器的42款Chrome插件
  15. ios快捷指令:修改图片尺寸、拼接长图
  16. vSphere中使用模板新建虚拟机
  17. 宝塔显示100%负载100%cpu解决办法
  18. 系统如何自动识别短信验证码
  19. java中driver是什么意思_java.sql.SQLException: com.sqljdbc.Driver什么意思啊?
  20. MySQL基础(二十八)索引优化与查询优化

热门文章

  1. 写完的文档有多少个字?字数统计在word哪里
  2. 梯度下降算法的解释及直观展示
  3. STM32CUBEIDE(15)----移植兆易创新SPI Nor Flash之GD25Q64Flash
  4. 【Kubernetes/docker】生成docker镜像推送到hub并在Kubernetes部署应用-20220407
  5. P1014 Cantor表
  6. Ti ub954/953 Sensor调试心得
  7. 使用ROS和AprilTags进行相机定位(二维码定位全流程)
  8. 操作系统 进程管理(一)——进程的含义与状态
  9. Laravel OAuth2 (一) ---简单获取用户信息
  10. DSP在SYS/BIOS下串口(UART)接收之环形队列