1. public class HelloServlet extends HttpServlet {
  2.  
  3. @Override
  4. protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
  5.  
  6. }
  7.  
  8. @Override
  9. protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
  10. doGet(req, resp);
  11. }
  12.  
  13. @Override
  14. public void init() throws ServletException {
  15. System.out.println("进入 服务器...");
  16. }
  17.  
  18. }

  

我们可以看到HttpServletRequest, HttpServletResponse这两个对象。可以说,这是JavaWeb中至关重要的两个对象。接下来,我们来做一个简短的说明:

1、HttpServletRequest

request对象(HttpServletRequest)代表客户端的请求,当客户端通过HTTP协议访问服务器
时,HTTP请求头中的所有信息都封装在这个对象中,通过这个对象提供的方法,可以获得客户端请求的所有信息。

其中,请求头就是Request Headers. 我们还可以看到请求的方式是Get方式,通过浏览器地址栏的方式就是GET方式。现在,我们改变在请求的同时加入一点信息:

http://localhost/wzry/login.do?username=admin&password=123&type=weixin

在请求地址后面加一个 ?,开始拼接数据,每一个数据都是key=value 的形式,不同数据之间用 & 连接。再次回车。我们可以看到信息发生了变化:

不论你是什么请求,你往服务器传递的数据只能是 字符串!

现在,我们可以在Servlet中接收这些参数!

  1. @Override
  2. protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
  3. String username=req.getParameter("username");
  4. String password=req.getParameter("password");
  5. String type=req.getParameter("type");
  6. System.out.println("用户登录...");
  7. System.out.println(username);
  8. System.out.println(password);
  9. System.out.println(type);
  10.  
  11. }

  

运行结果:

正常情况下,为了保存这些数据,我们都会各自建立一个Java类,比如用户类。我们为了方便起见,可以采用一种公用的数据结构来保存,那就是Map。从道理上也能明白吧,客户端传递数据到我们的服务器,我们是不是首先得想办法把它存起来?好像给你一筐鸡蛋,然后他说,鸡蛋给你,框子我得拿走,那么你是不是得找一个容器,把鸡蛋装起来呢?不就是这个道理嘛。

Map就是这么一个容器。
修改后的代码:

  1. @Override
  2. protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
  3. String username = req.getParameter("username");
  4. String password = req.getParameter("password");
  5. String type = req.getParameter("type");
  6. System.out.println("用户登录...");
  7.  
  8. System.out.println(username);
  9. System.out.println(password);
  10. System.out.println(type);
  11.  
  12. System.out.println("开始存入map...");
  13. Map<String,Object> map=new HashMap<>();
  14. map.put("username", username);
  15. map.put("password", password);
  16. map.put("type", type);
  17. System.out.println("存入map成功!");
  18. System.out.println(map);
  19. }

  

在实际的开发中,传进来的数据肯定是不一样的,如果我们太依赖于getParameter这个方法,就无法做到灵活变通。那么有没有一种通用的方法,让request对象中附带的数据自动转换为Map呢?

我已经封装好了一个工具类,里面就有这样的方法。

  1. public static Map<String,Object> getParameters(HttpServletRequest req){
  2. Map<String,Object> map=new HashMap<>();
  3. Enumeration<String> names = req.getParameterNames();
  4. while (names.hasMoreElements()) {
  5. String key=names.nextElement(); //获取key值
  6. map.put(key, req.getParameter(key)); //获取value值
  7. }
  8. return map;
  9. }

  

于是请求参数的获取就变得很简单了

  1. @Override
  2. protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
  3. System.out.println("用户登录...");
  4. System.out.println("开始存入map...");
  5. Map<String,Object> map=StringUtils.getParameters(req);
  6. System.out.println("存入map成功!");
  7. System.out.println(map);
  8. }

  

2、HttpServletResponse

Web服务器收到客户端的http请求,会针对每一次请求,分别创建一个用于代表请求的request对象(HttpServletRequest)、和代表响应的response对象(HttpServletResponse)。
request和response对象即代表请求和响应,那我们要获取客户机提交过来的数据,只需要找request对象就行了。要向客户机输出数据,只需要找response对象就行了。

在刚才的例子中,我们添加以下代码:

  1. resp.setContentType("text/html;charset=utf-8");
  2. PrintWriter writer = resp.getWriter();
  3. writer.println("登录成功!");

  页面效果:

我们通过这种方式,就可以往客户端发送一个数据。

刚才讲了GET方式提交可以直接在浏览器地址栏操作,GET方式提交的缺点就是会暴露自己的数据信息,还有一种POST提交的方式。相比GET方式要安全一点,它不会直接暴露数据。现在我们通过form表单来做一个讲解。
在WebContent目录下新建一个index.jsp。

编写form表单:

  1. <!-- post提交表单 -->
  2. <form action="login.do" name="myform" method="post" onsubmit="check();">
  3. <table>
  4. <tr>
  5. <td>用户名:</td>
  6. <td><input type="text" name="username" id="username" /></td>
  7. </tr>
  8. <tr>
  9. <td>密码:</td>
  10. <td><input type="password" name="password" id="password" /></td>
  11. </tr>
  12. </table>
  13. <input type="submit" value="提交"/>
  14. <input type="hidden" name="type" value="weixin" />
  15. </form>

  

我们一般还需要在后台进行一个验证。

我们故意不填写用户名和密码,点击登录按钮,结果并没有什么卵用。因为其实传递到后台是有值的,只是为””,这一点和js不同,在Java中,””不等于假,它只是代表一个空字符串。所以我们需要修改一下验证条件。还有,为了不让代码继续往下执行,我们需要及时return。

为了给用户返回错误信息,我们得把信息抛到页面上。

关注一下,这里有两个重复点,于是考虑封装。

  1. /**
  2. * 工具类
  3. * @author Administrator
  4. *
  5. */
  6. public class StringUtils {
  7. /**
  8. * 是否为空
  9. * @param o
  10. * @return
  11. */
  12. public static boolean isEmpty(Object o){
  13. if(o==null)return true;
  14. if("".equals(o))return true;
  15. return false;
  16. }
  17.  
  18. /**
  19. * 不为空
  20. * @param o
  21. * @return
  22. */
  23. public static boolean isNotEmpty(Object o){
  24. return !isEmpty(o);
  25. }
  26.  
  27. /**
  28. * 输出信息到页面
  29. * @param resp
  30. * @param o
  31. */
  32. public static void writeObject(HttpServletResponse resp,Object o){
  33. resp.setContentType("text/html;charset=utf-8");
  34. PrintWriter writer=null;
  35. try {
  36. writer= resp.getWriter();
  37. writer.println(o);
  38. } catch (IOException e) {
  39. e.printStackTrace();
  40. }finally {
  41. writer.flush();
  42. writer.close();
  43. }
  44. }
  45.  
  46. /**
  47. * 获取请求参数
  48. * @param req
  49. * @return
  50. */
  51. public static Map<String,Object> getParameters(HttpServletRequest req){
  52. Map<String,Object> map=new HashMap<>();
  53. Enumeration<String> names = req.getParameterNames();
  54. while (names.hasMoreElements()) {
  55. String key=names.nextElement(); //获取key值
  56. map.put(key, req.getParameter(key)); //获取value值
  57. }
  58. return map;
  59. }
  60. }

  

封装之后代码简洁很多了

  1. @Override
  2. protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
  3. System.out.println("用户登录...");
  4. System.out.println("开始存入map...");
  5. Map<String,Object> map=StringUtils.getParameters(req);
  6. System.out.println("存入map成功!");
  7. System.out.println(map);
  8.  
  9. if(StringUtils.isEmpty(map.get("username"))){
  10. StringUtils.writeObject(resp,"用户名不能为空!");
  11. System.out.println("用户名不能为空!");
  12. return;
  13. }
  14. if(StringUtils.isEmpty(map.get("password"))){
  15. StringUtils.writeObject(resp,"密码不能为空!");
  16. System.out.println("密码不能为空!");
  17. return;
  18. }
  19. StringUtils.writeObject(resp,"登录成功!");
  20. }

  

参考:https://www.cnblogs.com/skyblue-li/p/8251225.html

Servlet中接收和返回数据的更多相关文章

  1. 【Java框架型项目从入门到装逼】第五节 - 在Servlet中接收和返回数据

    在上一节的程序中,我们可以看到HttpServletRequest, HttpServletResponse这两个对象.可以说,这是JavaWeb中至关重要的两个对象.接下来,我们来做一个简短的说明: ...

  2. Loadrunner socket协议lrs_receive函数接收到返回数据包 仍然等待服务器返回--解决

    前段时间在使用loadrunner socket协议发送数据包到到服务器,使用lrs_receive接收服务器应答数据包,已经接收到数据包,但LR仍然在等待服务器端返回,而且日志打印显示每次接收返回都 ...

  3. 关于Node.js中HTTP请求返回数据需要JSON解析的问题

    在编写项目过程中,需要用到实时数据的推送需求, 所以首先想到了NodeJS的websocket模块 在网上找了一个聊天室的例子  然后将其改为自己需求的推送 其中遇到的问题 返回数据问题  :   由 ...

  4. web基础----->servlet中得到请求的数据

    对tomcat的源码做一些分析,今天我们就开始servlet中的请求分析. form表单中的默认类型 一.在index.jsp中get请求: <form action="Paramet ...

  5. springMVC中接收请求参数&&数据转发

    ### 1. 接收请求参数 #### 1.1. [不推荐] 通过HttpServletRequest获取请求参数 假设存在: <form action="handle_login.do ...

  6. servlet中请求转发获取数据等,,,

    String uname= req.getParameter("uname");  获取请求的字符串 req.setAttribute("str"," ...

  7. angular中ng-model,返回数据,拆分数据,展示,名称相同,重新赋值会有冲突

    本问题出在angular,1.X版本,我用的是1.5的版本: 问题原因: <input type="number" ng-mode="a" /> & ...

  8. ajax get和post请求 后端接收并返回数据

    get请求$(function(){ //alert("23"); var x = "#page"; var y = "${ctx!}/static/ ...

  9. wcf+linq to sql中关联查询返回数据问题

    前段时间准备采用wcf+nh框架开发sl程序,发现采用nh开发不适合我的中型.并且快速开发项目,所以综合考量了下,决定采用wcf+linq to sql . 但是此模式也有缺点,也是linq to s ...

随机推荐

  1. ASP.NET WEB应用程序(.network4.5)MVC 程序的结构解读1

    https://www.cnblogs.com/-beauTiFul/p/8036509.html 简介 开发环境:VS2015 ASP.NET:可以开发出几乎所有运行在Windows上的应用程序:. ...

  2. php实现命令行里输出带颜色文字

    今天执行composer的时候看到命令窗口出现的提示里面有的关键性部分带有颜色,于是很好奇研究了一下,在这里记录下来 其实在命令行输出带颜色字体主要是使用的 ANSI 转义字符实现的,我们先看个例子: ...

  3. Unable to open nested entry '********.jar' 问题解决

    今天把现网版本的task的jar拖回来然后用7-zip打开拖了一个jar进去替换mysql-connector-java-5.1.47.jar  为  mysql-connector-java-5.1 ...

  4. ajax格式,转入后台

    setInterval(function(),时间)定时重复发送请求

  5. liunx shell 脚本的基础知识

    Shell脚本编程30分钟入门====================## 什么是Shell脚本### 示例看个例子吧: #!/bin/sh cd ~ mkdir shell_tut cd shell ...

  6. Vue粒子特效(vue-particles插件)

    ` npm install vue-particles --save-dev ` ` import VueParticles from 'vue-particles' Vue.use(VueParti ...

  7. springload热更新的优缺点

    java开发web应用没有.net的方便快捷, 原因是传统开发模式下新增修改代码后要查看效果, 一般要重启应用, 导致浪费了许多无谓的时间,没有.net的高效, 任意更新文件实时生效. 但是有个叫sp ...

  8. Python学习记录8-继承2

    继承 单继承和多继承 单继承:每个类只能继承一个类 多继承:每个类允许继承多个类 >>> class A(): pass >>> class B(A): pass ...

  9. Linux学习笔记(十)shell基础:历史命令、命令补全、输出重定向、输出重定向

    一.历史命令 history [选项] [历史命令保存文件] -c 清空历史命令 -w 吧缓存中的历史命令写入历史命令保存文件~/.bash_history中 系统会默认将上次注销登录(正确退出)之前 ...

  10. jmeter——http、jdbc、soap请求

    1.jmeter——http 请求 1.1添加线程组 1.2添加http请求 1.3发起http请求 1.协议:通常一个http请求都会有相对应的协议,如HTTP,HTTPS等.这里除非有特殊要求,一 ...