前面几篇写的内容挺多挺乱,稍微理顺下:
1,网站无非是前后台交互
2,目前我们的后台可以认为是Servlet
3,前台可以认为是JSP和HTML
4,Servlet因为可以写out.println("<br/>");等输出到前台的html内容,所以一定程度上它的输出可以认为是前台。
5,JSP因为可以在<%%>中间写Java代码后台逻辑,所以可以当后台使用
6,不管是html还是jsp,其实都是在服务器端的,区别是:客户端访问时,html直接传给客户端,jsp需要先转换为Serlvet,然后Servlet运行结果返回给客户端。当然其实我们都不用管,会用就行
好,猫哥整理逻辑之后,果然更乱了。其实不是猫哥整理的乱,而是因为JSP和Servlet能力太强,所以有时候啊,得有个领导给他们分分工,设定下各自的职责和目标,激发他们最大的能力。所谓的领导,当然是程序设计世界的上帝——程序猿和美丽的程序媛啦——哎哎,那谁谁,看到程序媛,眼都直了。
OK,按照业内比较流行的做法,就是JSP负责显示的外观和显示的具体内容,Servlet负责根据需求提供获取的内容冰处理业务逻辑。在这个过程中,涉及从前台网页提交数据到Servlet,这个问题已做了详细说明,此处不表。还涉及一个从Servlet将数据返回给网页显示的问题,这个问题有以下处理方案:
方案1,Servlet处理后,跳转到HTML页面,因为HTML页面是静态的,所以无法实现输出动态结果的功能。比如就无法输出不同班级不同的学生列表。
方案2,Servlet处理后,使用out.print()输出处理结果。这个方法可行,但是输出的内容混杂着许多html标签,导致前端后端完全无法分离。
方案3,Servlet处理后,跳转到JSP页面,方法可行。但是需要将数据(比如学生列表)从Servlet传递到JSP页面。
综合方案1-3,方案3如果实现的好,可以在最大程度上实现前后端分离,逻辑清晰,所以方案3得到了大家的喜爱。同时大家完全不必担心方案3中的数据传输问题,Servlet/JSP提供了内置对象 这样的逆天神器——其实就是封装好的对象,非常棒的解决了这个问题。
OK,本篇我们只讲最最常用的四个内置对象response、out、request、session。
先来看个例子
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {//response封装了客户端响应模型
//request封装了客户端请求的信息
PrintWriter out = response.getWriter();//out用于输出
我们知道,网页提交请求到服务器,然后服务器响应请求输出结果。这个过程从根本上讲是数据包的传递,再根本上讲是电压等物理信号的传递。然而我们不管,在Servlet和JSP世界,这些信号被封装到了request和response对象中。也就是说,request对象中包含着客户端请求的信息,而response代表着服务端对客户端响应的信息,通过它哥俩,程序员就能非常方便获取、操作输入输出(请求响应)。
然后out对象呢,其实就是response的一个小弟,response对象封装的是对客户端的各种响应,最常见的就是输出(当然不止输出,还有网页跳转什么的也算响应)。所以out也成了一个内置对象。
上面的例子是在Servlet中使用response、out、request,在JSP中更加简单,看例子
<body>
该班的学生有:<br/>
<%
response.setContentType("text/html");//设置输入格式
response.setContentType("text/html");
request.setCharacterEncoding("utf-8");
response.setCharacterEncoding("utf-8");
String classId=request.getParameter("class");//获取要查询的班级id
StudentOperation stuOper=new StudentOperation();
List students=stuOper.selectByClassId(classId);
for(Object obj:students){
StudentInfo stu=(StudentInfo)obj;
out.print("姓名:"+stu.getStudentName()+" ");
out.print("班级:"+stu.getStudentClass().getClassName());
%>
<br/>
<%
}
%>
</body>
可见,这三个对象是可以在JSP中直接不打招呼拿来用的,那叫一个方便,所以才叫内置对象吗。内置的意思,不用在置办了,咱JSP天生就有!
OK,所以从Servlet向JSP传值,变得如此简单:
Servlet端: request.setAttribute("name", "张三");
JSP获取: request.getAttribute("name");
attributte的意思是“属性”,request.setAttribute("name", "张三");
的意思是在request这个内置对象添加一个叫name的属性,属性值是张三。request.getAttribute("name");
的意思是从request这个内置对象中获取名字是name的属性的值。
OK,还有一个session,这个才是难点。
session也有setAttribute和getAttribute方法,同样可以从Servlet向JSP传值。
那有request就够了,还要session干嘛?session具备非常重要的意义,request代表一次请求,而session代表一次会话,所谓回话的意思就是一个客户在使用一个浏览器客户端访问服务器期间,session在此期间生存在唯一。简单点,session有点像为每个用户分配的静态对象,开始访问时生成,关闭浏览器时销毁。这个可能不好理解,暂时先会用request传值就行了,session在具体实践中再讲。
OVER!