B 就是 browser,浏览器,而 S 就是 server,服务器
这个系列的文章,将围绕两个问题来讲解:
- JSON 是什么?
- 为什么要学 JSON?
而在这研究两个问题之前,先研究 Java 中 浏览器端,也就是 JSP,与服务器端,也就是 Tomcat 的 Servlet 他们是如何进行数据传递的?
看下面的例子!
(如果很了解这个过程,可以草草看一下,或者直接跳过这个小节!)
用户登录验证
过程很简单:
获取前台输入账户和密码,传到服务器,和数据库中的账户密码验证,若数据库存在两个相匹配的字段,就是对上了就登录成功,否则登录失败
在这里,我们关注其中的几个问题:
- 如何传前台的数据到服务器?
- 服务器又如何获取到前台的数据?
- 如何传服务器的数据到前台?
- 前台又如何获取到服务器的数据?
注:这里使用 JSP + Sevlet + IDEA 2018 研究
首先对于前台
稍微用 Bootstap 修饰了下,Jquery 是待会要用的,如下:
注:在 IDEA 中直接在包右键可以快速创建一个带模板 JSP
index.jsp:写个 form,然后两个 input,能登录提交即可:
若成功则跳转到 mainPage.jsp,这个就是简单的提示信息:
接着对于后台
我们写个简单的 servlet 然后在 web.xm 绑定以下即可(这里重点研究传值过程,不使用数据库,使用简单的 if 来验证!):
同样,在包右键即可快速创建一个 Servlet
web.xml 中绑定 Servlet:
最后,一个简单的,从前台到后台的,登录验证就好了,效果如下:
分析这个过程,回答上面的四个问题
- 如何传前台的数据到服务器:通过 form 表单提交
- 服务器又如何获取到前台的数据:通过内置的 request 对象获取
- 如何传服务器的数据到前台:通过 session 对象 + 重定向
- 前台又如何获取到服务器的数据:通过 session 对象以及相应的 JSP 表达式
除了重定向,也可以用请求转发实现
有了上面那个实践的例子,使用方法都是类似的,现在简单罗列一下在 Java 中,数据传递的几种方式如下:
JSP 传递值给 Servlet
1.通过 form 表单提交
- JSP:建立一个 form 表单,给里面的元素加上 name 属性,表单提交的 action 等于一个 servlet 的 url-pattern
- Servlet:建立一个 servlet,并在 servlet 里使用 request.getParameter("parameterName"); 即可获取到对应的参数
- web.xml:给上面要传递的 servlet 匹配一个 url-pattern
2.通过元素的 href 属性
- JSP:有一些元素如 <a> 是带有 href 的属性的,可以指定值为 url-pattern?parameterName=xxx¶meterName=xxx ... 这样的形式来传递值给 Servlet
- Servlet:建立一个 servlet,并在 servlet 里使用 request.getParameter("parameterName"); 即可获取到对应的参数
- web.xml:给上面要传递的 servlet 匹配一个 url-pattern
3.通过 session 对象 session 结构可看作是 hashmap,而 session 的有效范围是项目所有的 servlet 和 jsp,生命周期大概 30min,也可以通过配置文件修改
- JSP:调用方式例如:<% request.getSession.setAttribute("acc", "jalr"); %>
- Servlet:建立一个 servlet,并在 servlet 里使用 (String)request.getSession().getAttribute("acc"); 即可获取到对应的参数 "jalr"
- web.xml:给上面那个要传递的 servlet 匹配一个 url-pattern
注意:取得传过来的值上转型为 Object 类型,故要强制类型转换为原类型,否则 ClasscastException
Servlet 传递值给 JSP
1.通过 RequestDispatcher 请求转发
- Servlet:在 doGet() 或 doPost() 中利用 request 对象以及请求转发到指定要取值的页面,注意路径问题!这里的路径需要在前面加 "/" ! request.setAttribute("acc", "jalr"); request.getRequestDispatcher("/index.jsp").forward(request, response); //跳转回 index.jsp
- JSP:在任意需要值的地方用 <%=request.getAttribute("acc")%>,如此取得 "jalr",同 session,上转型
- web.xml:给上面那个要传递的 servlet 匹配一个 url-pattern
2.通过 sendRedirect 重定向 重定向使用 session 作为中间传递,注意路径问题!
- Servlet:在 doGet() 或 doPost() 中利用 response 对象以及请求转发到指定要取值的页面,注意路径问题!这里的路径不需要在前面加 "/" ! request.getSession().setAttribute("acc","jalr4ever"); response.sendRedirect("index.jsp");
- JSP:在任意需要值的地方用 <%=session.getAttribute("acc")%>,如此取得 "jalr",同理这个值是上转型为 Object 的,使用的时候需要强制转换类型下来
后记:
关于 sendRedirect-重定向 与 RequestDispatcher-请求转发 的区别
- 请求转发前后页面共享一个 request ,这个是在服务端运行的,重定向前后页面用的不是一个 request,而这个是在客户端运行的
- 请求转发跳转后浏览器地址栏不会变化,重定向跳转后浏览器地址栏会变化