1.简介:
问题:浏览器通过http协议请求web服务器,去访问web服务器上面的资源,然而资源有静态资源和动态资源,静态资源可以直接对web服务器进行访问,那么动态资源(需要数据交互)该如何访问呢
Servlet是服务器端的java程序,能够接受用户请求,处理用户请求,并对用户请求做出响应的动态网页技术
Servlet的作用:
- 接受客户端的HTTP请求(浏览器)
- 根据用户请求进行数据处理
- 动态生成网页(网页中数据交互)
- 将生成的包含动态数据的网页响应给客户端
2.创建JavaWeb工程
idea创建 注意:需要导入tomcat服务器
3.创建Servlet
Servlet是一个java程序,是一个能够接受http请求的java类,因此需要HTTP协议
在JavaEE库中有一个类HttpServlet实现了HTTP协议,我们创建的类只要继承这个HttpServlet类,就实现了HTTP协议,就能接受HTTP请求
步骤:
(1):创建一个类继承 javax.servlet.http.HttpServlet
(2):继承HttpServlet的类可以接受请求,这种可以接受请求的类名字叫做 …Servlet
(3):在创建类的过程中,重写doPost/doGet方法来获取请求
4.配置Servlet
<!-- 配置BookListServlet类的访问路径-->
<!-- 配置Servlet的根路径-->
<servlet>
<!--理论上可以取任何名字,但是名字不能重复,实际开发中最好做到与类名相同-->
<servlet-name>BookListServlet</servlet-name>
<!-- Servlet类路径-->
<servlet-class>com.edu.test1.BookListServlet</servlet-class>
</servlet>
<!-- servlet-mapping 配置url -->
<servlet-mapping>
<!--servlet-mapping标签中的servlet-name必须和servlet标签中的servlet-name一样-->
<servlet-name>BookListServlet</servlet-name>
<!--url-pattern标签配置访问路径 其命名格式必须以/开头-->
<url-pattern>/book-list</url-pattern>
</servlet-mapping>
或者
注解配置Servlet
在创建的Servlet类中写入@WebServlet("/book-query")
5.浏览器访问测试
通过浏览器发送HTTP请求,访问Tomcat中Web项目的Servlet类
6.GET请求和POST请求
Servlet类中的doGet和daPost是用来处理不同请求方式的HTTP请求,在HTTP协议中,HTTP协议请求有多种请求方式(get/post/delete/put/option…),不同请求方式访问的数据是不同的
- Servlet中的doGet方法是用来处理客户端的get请求
- Servlet中的doPost方法是用来处理客户端的post请求
6.1Get请求
- 使用Get请求服务器,传递的参数会拼接到URL后面,以?分割url和参数,多个数据以&符号连接
- get 是明文提交,提交数据量小,安全性差
- get 请求效率较高,浏览器默认的是get请求的
- get方式提交数据的场景
- 浏览器地址栏
- 网页的超链接
- form表单 method="get请求"
6.2Post请求
- 使用POST请求服务器,参数是通过请求正文进行传递的(request body)
- POST请求是密文提交,数据量大,比较安全
- POST请求的效率较低
- Post方式提交数据的场景
- form表单 method="post请求"
7.Servlet响应动态网页
在浏览器中输入http://localhost:8080/demo01/book-query?id=1001可以查询到图书编号为1001书籍的数据
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("QueryListServlet-------doGet");
//动态获取HTML页面
//1:获得浏览器请求时传递的ID(bookId)
String bid = request.getParameter("bookId");
//2:根据bid查询数据库表中的数据
Map<String,Book> bookMap=new HashMap<>();
bookMap.put("1001",new Book("1001","Java","张三",58,null));
bookMap.put("1002",new Book("1002","C","李四",68,null));
bookMap.put("1003",new Book("1003","Python","王二",48,null));
Book book = bookMap.get(bid);
//3:将查询到的数据生成网页,响应给浏览器
// 通过IO流向浏览器响应数据,
response.setCharacterEncoding("utf-8");
response.setContentType("text.html");
PrintWriter out=response.getWriter();
out.println("<!DOCTYPE html>");
out.println("<html>");
out.println("<head><meta charset='utf-8'><title>Servlet响应的网页</title></head>");
out.println("<body>");
out.println("<table>");
out.println("<tr><th>图书编号</th><th>图书名称</th><th>作者姓名</th><th>图书价格</th><th>图书照片</th></tr>");
out.println("<tr>");
out.println("<td>"+book.getBookId()+"</td>");
out.println("<td>"+book.getBookName()+"</td>");
out.println("<td>"+book.getBookAuthor()+"</td>");
out.println("<td>"+book.getBookPrice()+"</td>");
out.println("<td>"+book.getBookImgPath()+"</td>");
out.println("</tr>");
out.println("</table>");
out.println("</body>");
out.println("<html>");
out.flush();
out.close();
}