Java网络开发(Tomcat)—— web的 请求request (post和get请求)和 响应response


用户名:
密   码:
昵   称:

返回主界面

(2)servlet文件

package com.tianju.web.servlet;

import com.tianju.web.entity.User;
import com.tianju.web.service.IUserService;
import com.tianju.web.service.impl.UserServiceImpl;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
* 用户注册的服务
*/
@WebServlet(value = “/registerUser”)
public class UserRegisterServlet extends HttpServlet {
private IUserService userService = new UserServiceImpl();
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 先定义编码方式
request.setCharacterEncoding(“UTF-8”);
response.setCharacterEncoding(“UTF-8”);
response.setContentType(“text/html;charset=utf-8”);

String username = request.getParameter(“username”);
String password = request.getParameter(“password”);
String nickname = request.getParameter(“nickname”);

System.out.println(“注册的输入为”);
System.out.println(username + “/”+password+“/”+nickname);
}

以登陆流程为例:

在这里插入图片描述

页面跳转流程如下:

在这里插入图片描述

4.get请求和post请求

在上面案例中,我们用的是get请求,可以把get修改为post,观察有什么不同的地方?

get请求有点像我们作为客户去消费,直接给现金,对方给商品,可以清楚的看到给的金额。

post请求类似我们消费的时候,给商家会员卡,我们的客户信息,余额等等都在会员卡里面。

1.get请求:

(1)直接在浏览器中发送一个请求;

(2)在form表单中把method = get;

特点:

(1)请求的数据直接拼接在浏览器的地址中;

(2)请求有长度限制;

(3)一次性请求;

(4)没有编码问题,数据在链接中,tomcat8以上会用UTF-8处理;

2.post请求:

特点:

(1)请求数据不在地址栏,而在请求体中;

(2)原则没有长度限制,取决于浏览器的设置;

(3)两次请求;

(4)post的数据放到请求体里面,请求体的内容,tomcat拿到后不处理,直接放request请求体中;

在这里插入图片描述

结论:post请求和get请求的区别

(1)post请求更安全(不会作为url的一部分,不会被缓存、保存在服务器日志、以及浏览器浏览记录中,get请求的是静态资源,则会缓存,如果是数据,则不会缓存)

(2)post请求发送的数据更大(get请求有url长度限制,http协议本身不限制,请求长度限制是由浏览器和web服务器决定和设置)

(3)post请求能发送更多的数据类型(get请求只能发送ASCII字符),但是后端需要处理编码问题

(4)传参方式不同(get请求参数通过url传递,post请求放在request body中传递)

(5)get请求产生一个TCP数据包;post请求产生两个TCP数据包(get请求,浏览器会把http header和data一并发送出去,服务器响应200返回数据;post请求,浏览器先发送header,服务器响应100 continue,浏览器再发送data,服务器响应200 返回数据)

注意:

  • 直接在浏览器地址栏输入链接,不通过表单发送的请求,也是get请求。
  • 那我们什么时候用get,什么时候用post呢?一般如果是要找服务器查询数据用get,如果给服务器提交登陆注册等信息用post。
  • 如果是post发送的数据有特殊字符和中文,后端需要使用req.setCharacterEncoding(“UTF-8”);来设置编码

编码设置代码

req.setCharacterEncoding(“UTF-8”);
resp.setCharacterEncoding(“UTF-8”);
resp.setContentType(“text/html;charset=utf-8”);

响应response

服务器如果要返回数据怎么办?,我们学习web要清楚,一切的请求信息,都在request对象中,一切的响应,都是由response对象来处理。

// 解决中文的显示问题
response.setCharacterEncoding(“UTF-8”); // 设置成编码
response.setContentType(“text/html;charset=utf-8”); // 展示的方式
response.getWriter().write(“

inputSuccess

”);

1.用户登陆前端显示一段话

response.getWriter().write();方法

在这里插入图片描述
如何实现用户登陆的业务逻辑:

用户登陆的服务,注意不能用log
1.username + password 查询对象出来,对象有,登陆成功,否则失败;
2.查询数量出来,1成功,否则失败;
3.【建议】springSecurity 推荐,用username 查一个对象;
3.1 查不到,登陆失败(没有注册过,数据库无这个用户名);
3.2 查到了,用户名正确,就用这一条记录的密码和前端发送的密码对比;
如果正确,登陆成功,不登录失败;

package com.tianju.web.servlet.user;

import com.tianju.web.entity.User;
import com.tianju.web.service.IUserService;
import com.tianju.web.service.impl.UserServiceImpl;
import com.tianju.web.util.StringUtils;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* 用户登陆的服务,注意不能用log
* 1.username + password 查询对象出来,对象有,登陆成功,否则失败;
* 2.查询数量出来,1成功,否则失败;
* 3.【建议】springSecurity 推荐,用username 查一个对象;
* 3.1 查不到,登陆失败(没有注册过,数据库无这个用户名);
* 3.2 查到了,用户名正确,就用这一条记录的密码和前端发送的密码对比;
* 如果正确,登陆成功,不登录失败;
*/

@WebServlet(“/loginUserNew”)
public class LoginServlet extends HttpServlet {
private IUserService userService = new UserServiceImpl();
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 解决编码的问题
req.setCharacterEncoding(“UTF-8”);
resp.setCharacterEncoding(“UTF-8”);
resp.setContentType(“text/html;charset=utf-8”);

// 获取前端传来的用户名
String username = req.getParameter(“username”);
String password = req.getParameter(“password”);
if (StringUtils.isBlank(username) || StringUtils.isBlank(password)){
resp.getWriter().write(“

必填项为空

”);
return;
}

// 登陆错误,重新输入
User user = userService.findByUsername(username);
if (user==null || !password.equals(user.getPassword())){
resp.getWriter().write(“

用户名|密码错误

”);
return;
}
String out = “

用户名”+user.getUsername() +“/”+ user.getNickname() +“登陆成功”+“

”;
resp.getWriter().write(out);

}
}

2.如何在前端显示一张表

(1)登陆成功----跳转到首页;response request 可以一定程度解决;

(2)查询所有用户信息;jsp——>ajax-axios【主流】——>thymelaf

方案:在servlet中把前端拼出来,放到resp.getWriter().write(out);中进行显示:

转发和重定向

1.请求转发—request

有人来咨询,转给对接咨询的人,请求——>前台(servlet)——>咨询(servlet)

特点:一次性,共享数据

请求转发是指一个请求到服务器后,第一个Servlet接收到这个请求,可以把这个请求再发送给下一个处理的Servlet或者资源,整个过程中,都只有一个请求,比如我们去饭店点餐,下单后,服务员收到请求,发送给厨师,厨师做好后,给端菜的服务员,最终到我们收里,这整个过程,处理的其实是一个请求。Servlet也类似。

req.getRequestDispatcher(“/b”).forward(req,resp);

@WebServlet(“/a”)
public class AServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

//把请求"/a"转发到"/b"
req.getRequestDispatcher(“/b”).forward(req,resp);
}
}

转发过程中,也可以共享A数据,比如A处理完以后,可以在一个请求内共享数据,然后要交给B处理,B 也可以获取共享的数据。如下:

@WebServlet(“/a”)
public class AServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//共享一个菜名
req.setAttribute(“name”,“鱼香肉丝”);
//把请求"/a"转发到"/b"
req.getRequestDispatcher(“/b”).forward(req,resp);
}
}

在转发的下一个Servlet中,获取这个菜名

@WebServlet(“/b”)
public class BServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setAttribute(“name”,“鱼香肉丝”);
//把请求"/a"转发到"/b"
req.getRequestDispatcher(“/b”).forward(req,resp);
}
}

@WebServlet(“/b”)
public class BServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String name = (String)req.getAttribute(“name”);
System.out.println(name);
}
}

注意转发(forward)的特点:

  • 转发地址栏路径不变
  • 转发只能访问当前服务器下的资源
  • 转发是一次请求,可以使用request对象来共享数据
  • 转发由request控制

2.响应重定向----response

特点:值不共享,浏览器的地址变化

重定向的意思是:第一次请求到达服务器后,服务器处理完成,可以在响应信息中告诉浏览器去下一个地址,浏览器会自动请求下一个路径。这个过程中浏览器发送了两次请求。从这里可以看出重定向是由响应response发起的。

resp.sendRedirect(“/day01/demo2”);

重定向的特点:redirect

  1. 地址栏发生变化,因为浏览器要访问重定向的地址
  2. 重定向可以访问其他站点(服务器)的资源
  3. 重定向是两次请求。不能使用request对象来共享数据
  4. 重定向由response控制

在这里插入图片描述

【需求】表格显示在网页

方案一:把网页拼出来—本质是用response

resp.getWriter().write(sb.toString());

package com.tianju.web.servlet.bookType;

import com.tianju.web.entity.BookType;
import com.tianju.web.service.IBookTypeService;
import com.tianju.web.service.impl.BookTypeServiceImpl;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.List;

/**
* 把图书类型表格拼出来,显示到页面上
*/
@WebServlet(“/bookTypes/list”)
public class ListServlet extends HttpServlet {
private IBookTypeService bookTypeService = new BookTypeServiceImpl();
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 先定义编码方式
req.setCharacterEncoding(“UTF-8”);
resp.setCharacterEncoding(“UTF-8”);
resp.setContentType(“text/html;charset=utf-8”);
List typeList = bookTypeService.findAll();

// 把前端拼出来
StringBuffer sb = new StringBuffer();
sb.append(“\n” +
“<html lang=“en”>\n” +
“\n” +
" <meta charset=“UTF-8”>\n" +
" Title\n" +
“\n” +
“\n” +
“<table width=“500px” border=“1px”>\n” +
" \n" +
" id\n" +
" 姓名\n" +
" 简介\n" +
" 操作人\n" +
" \n");
for(BookType bookType:typeList){
sb.append(" \n" +
" “+bookType.getId()+”\n" +
" “+bookType.getName()+”\n" +
" “+bookType.getIntro()+”\n" +
" “+bookType.getOperator()+”\n" +
" ");
}

// 再把结尾拼进来;
sb.append(“\n” +
“\n” +
“\n” +
“”);
resp.getWriter().write(sb.toString());

}
}

在这里插入图片描述

存在问题:
前后端代码耦合;
实现不够灵活;

方案二:用jsp解耦前后端代码—本质是request转发

Jsp本质是一个Servlet
resp.sendRedirect(req.getContextPath() + “/b”);

1.pom.xml导包
javax.servlet.jsp javax.servlet.jsp-api 2.3.3 provided javax.servlet jstl 1.2 taglibs standard 1.1.2
2.web.xml换高版本 — 不然没法显示
<?xml version="1.0" encoding="UTF-8"?>


3.Servlet转发到webApp中的jsp中

共享值:req.setAttribute(“typeList”, typeList);

转发:req.getRequestDispatcher(“/bookType/list.jsp”).forward(req,resp);

访问http://localhost:10081/day01/bookList/jsp 转发到jsp
servlet部分代码:

package com.tianju.web.servlet.bookType;

import com.tianju.web.entity.BookType;
import com.tianju.web.entity.User;
import com.tianju.web.service.IBookTypeService;
import com.tianju.web.service.IUserService;
import com.tianju.web.service.impl.BookTypeServiceImpl;
import com.tianju.web.service.impl.UserServiceImpl;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.List;

@WebServlet(“/bookList/jsp”)
public class ListServletJSP extends HttpServlet {
private IBookTypeService bookTypeService = new BookTypeServiceImpl();
private IUserService userService = new UserServiceImpl();
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 先定义编码方式
req.setCharacterEncoding(“UTF-8”);
resp.setCharacterEncoding(“UTF-8”);
resp.setContentType(“text/html;charset=utf-8”);
List typeList = bookTypeService.findAll();
// 共享到request请求中
req.setAttribute(“typeList”, typeList);
User user = userService.findByUsername(“admin”);
req.setAttribute(“user”, user);
// 转发到/bookType/list.jsp,内部转发,是同一个请求
// 所以jsp可以拿到
req.getRequestDispatcher(“/bookType/list.jsp”).forward(req,resp);
}
}

4.jsp部分代码----显示结果

获取值的方法:${typeList}

获取属性的方法:${user.username}

循环的方法:c:forEach items=“${typeList}” var=“booktype”

${user.username}

<%@ taglib prefix=“c” uri=“http://java.sun.com/jsp/jstl/core” %>
<c:forEach items=“${typeList}” var=“booktype”>

完整代码

<%@ taglib prefix=“c” uri=“http://java.sun.com/jsp/jstl/core” %>
<%@ page contentType=“text/html;charset=UTF-8” language=“java” %>

JSP获得图书类型 <%--调用toString方法--%> ${typeList}

获得对象 ${user}

获取属性 ${user.username}

<%–显示表格–%>

id类型名称简介创建时间修改时间操作人员

<%-- 用foreach方法–%>

<c:forEach items=“${typeList}” var=“booktype”>

${booktype.id} ${booktype.name} ${booktype.intro} ${booktype.createTime} ${booktype.updateTime} ${booktype.operator}

</c:forEach>

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数软件测试工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年软件测试全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上软件测试开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注软件测试)
img

一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!**

因此收集整理了一份《2024年软件测试全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
[外链图片转存中…(img-8HlaoHZC-1712878655569)]
[外链图片转存中…(img-rf8nDe8i-1712878655570)]
[外链图片转存中…(img-kU0ojOZ7-1712878655570)]
[外链图片转存中…(img-xkiAYUWa-1712878655571)]
[外链图片转存中…(img-QqvdUVJC-1712878655572)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上软件测试开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注软件测试)
[外链图片转存中…(img-9hVDYEKS-1712878655572)]

一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 8
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java Web开发是指使用Java技术进行Web应用程序开发。以下是Java Web开发的一些知识点: 1. Servlet:Java Servlet是一种运行在Web服务器上的Java程序,用于处理HTTP请求响应。它是Java Web开发的基础。 2. JSP:Java Server Pages是一种动态Web页面技术,它允许在HTML页面中嵌入Java代码。JSP页面在服务器端被解析和编译成Servlet。 3. Spring框架:Spring是一个开源的Java框架,用于构建企业级应用程序。它提供了许多功能,包括依赖注入、面向切面编程、数据访问和Web开发。 4. Hibernate框架:Hibernate是一个开源的Java框架,用于将Java对象映射到关系数据库中。它提供了一种简单的方法来处理数据库操作,避免了编写大量的JDBC代码。 5. RESTful Web服务:RESTful Web服务是一种基于HTTP协议的Web服务,它使用标准的HTTP方法(如GET、POST、PUT和DELETE)来实现对资源的操作。 6. Maven:Maven是一个开源的项目管理工具,用于构建、测试和部署Java应用程序。它提供了一种简单的方法来管理项目依赖关系和构建过程。 7. Tomcat服务器Tomcat是一个开源的Web服务器,用于运行Java Web应用程序。它支持Servlet和JSP技术,并提供了一个简单的方法来部署和管理Web应用程序。 ```java // 以下是一个简单的Servlet示例 import java.io.*; import javax.servlet.*; import javax.servlet.http.*; public class HelloWorld extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html"); PrintWriter out = response.getWriter(); out.println("<html>"); out.println("<head>"); out.println("<title>Hello World</title>"); out.println("</head>"); out.println("<body>"); out.println("<h1>Hello World!</h1>"); out.println("</body>"); out.println("</html>"); } } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值