servlet、JSP简易总结
项目要求学习j2ee,先从servlet和JSP学起,这是后面框架的基础。
SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。
一、简介
学习一项新技术之前,先要搞明白这项技术是什么、为什么要学。
servlet是一种处理动态web网页的技术,本质是实现了servlet接口的类,可用于实现网页的逻辑。而JSP就是一种servlet,它是先编译成servlet再执行的文件。
为什么要学?虽然后面的框架可以替代这两个东西,但是学习servlet可以更好地理解处理动态web网页的方法,有助于后面的学习。
二、知识总结
本人小白,只学习了浅显简易的知识,在此处做简单总结。
1.servlet生命周期
一个Servlet的生命周期由实例化,初始化,提供服务,销毁,被回收几个步骤组成
实例化(进行构造方法)首先要知道,一个servlet类只实例化一次,换句话说就是只创建一个对象,当第二次访问时不再创建
初始化(进行init()方法):在构造方法执行后执行。和实例化一样,无论访问了多少次,初始化只进行一次
提供服务(进行service()方法):在service()中编写我们的业务代码,通过浏览器传递过来的信息进行判断,是调用doGet()还是doPost()方法
销毁(进行destroy()方法):该Servlet所在的web应用重新启动或者关闭tomcat时会调用这个方法
被回收:gc进行垃圾回收
2.两种跳转
服务器端跳转:
比如,如果登录成功跳转到success.html可用request.getRequestDispatcher("success.html").forward(request, response)语句,服务器端的跳转有如下性质
(1)浏览器路径不变
客户并不知道服务器是将本页面跳转到另一个页面进行处理的,浏览器中的路径不会变成success.html
(2)request保持一致
如果向跳转前的页面传参数,跳转后的页面也可以收到这个参数
//此处应有代码说明,在此不展示了
客户端跳转:
语句为response.sendRedirect("fail.html")。和服务器端跳转相反,有如下性质
(1)浏览器路径改变
用这种语句实质上是使客户端重定向,所以客户端可以知道这个信息,浏览器路径会变为跳转后的路径
(2)request改变
原理同(1)重定向相当于对新路径重新发起了一次http请求,所以request对象不是同一个,向第一个页面传参数后面的页面不会受到这个参数
在JSP中,服务器端跳转还可以使用<jsp:forward page="hello.jsp"/>的简化代码
3.request、response方法总结
request.getRequestURL(): 浏览器发出请求时的完整URL,包括协议 主机名 端口(如果有)"
request.getRequestURI(): 浏览器发出请求的资源名部分,去掉了协议和主机名"
request.getQueryString(): 请求行中的参数部分,只能显示以get方式发出的参数,post方式的看不到
request.getRemoteAddr(): 浏览器所处于的客户机的IP地址
request.getRemoteHost(): 浏览器所处于的客户机的主机名
request.getRemotePort(): 浏览器所处于的客户机使用的网络端口
request.getLocalAddr(): 服务器的IP地址
request.getLocalName(): 服务器的主机名
request.getMethod(): 得到客户机请求方式一般是GET或者POST
获取参数:
request.getParameter(): 是常见的方法,用于获取单值的参数
request.getParameterValues(): 用于获取具有多值的参数,比如注册时候提交的 "hobits",可以是多选的。
request.getParameterMap(): 用于遍历所有的参数,并返回Map类型。
PrintWriter pw= response.getWriter():设置响应内容
response.setContentType("text/html"):设置响应格式
4.jsp基本语法
jsp在形式上可以看成在html中写java代码,jsp由这些页面元素组成
(1) 静态内容
就是html,css,javascript等内容
(2)指令
以<%@开始 %> 结尾,比如<%@page import="java.util.*"%>
(3)表达式 <%= %>
用于输出一段html
(4) Scriptlet
在<%%> 之间,可以写任何java 代码
(5) 声明
在<%!%> 之间可以声明字段或者方法。但是不建议这么做。
(6)动作
<jsp:include page="Filename" > 在jsp页面中包含另一个页面。
(7)注释 <%-- -- %>
不同于html的注释 <!-- --> 通过jsp的注释,浏览器也看不到相应的代码,相当于在servlet中注释掉了
5.两种包含
jsp中有两种方式包含页面,指令include和动作include
(1)指令include
in.jsp:
<
hr
>
被嵌入的jsp
</
p
>
out.jsp:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
外部jsp
<%@include file="in.jsp" %>
指令include通过指令<%@include file="include.jsp" %>来实现。用这种方法包含页面是在编译时就把页面包含进来一起编译,只会生成一个.java文件。同时,因为指令<%@include 会导致两个jsp合并成为同一个java文件,所以就不存在传参的问题,在out.jsp 里定义的变量,直接可以在in.jsp中访问
(2)动作include
将out.jsp中最后一句改为<jsp:include page="in.jsp" />就成为了动作include。这种方法包含页面是动态的包含,如果不执行这句话,in.jsp就不会被编译,因此这样包含依旧会生成两个.java文件,并且用这种方法还可以像函数一样传递参数
如
<jsp:include page="in.jsp"> <jsp:param name="year" value="2017" /> </jsp:include> 就传递了year这个参数,in.jsp可以使用这个参数。 6.cookie、session (1)cookie Cookie是一种浏览器和服务器交互数据的方式。Cookie由服务器端创建, 创建好之后,发送给浏览器。浏览器保存在用户本地。 下一次访问网站的时候,就会把该Cookie发送给服务器。平时我们用的记住登录状态就是用的cookie。cookie会在客户端存一段时间,具体时间可由服务器决定。
下面是cookie的使用演示
//cookie的存储方式类似于map,是一种键值对的存储结构,键必须是String类型,值是Object类型
Cookie c = new Cookie("name", "Gareen"); //创建了一个cookie,名字是"name" 值是"Gareen"
c.setMaxAge(24 * 60 * 60); //表示这个cookie可以保留一天,如果是0,表示浏览器一关闭就销毁
c.setPath("/"); //Path表示访问服务器的所有应用都会提交这个cookie到服务端,如果其值是 /a, 那么就表示仅仅访问 /a 路径的时候才会提交 cookie
response.addCookie(c); //通过response把这个cookie保存在浏览器端
Cookie[] cookies = request.getCookies(); //表示获取所有浏览器传递过来的cookie
if (null != cookies ) //如果浏览器端没有任何cookie,得到的Cookie数组是null
//遍历所有的cookie
for (int d = 0; d <= cookies.length - 1; d++) { out.print(cookies[d].getName() + ":" + cookies[d].getValue() + "<br>"); } (2)session session和cookie一样,是记录网页状态的数据,它存在服务器端。session的中文翻译是会话,它从用户打开浏览器访问一个网站开始,无论在这个网站中访问了多少页面,点击了多少链接,都属于同一个会话, 直到该用户关闭浏览器为止。session的一个使用实例是电商网站中的购物车,当你选好要买的东西,放入购物车中,点击结算按钮,通过session来记录你买了什么东西。 虽然是在服务器端的数据,但对每个访问它的客户端都有一个独立的session。用上面的购物车例子解释:比如A客户买了两件东西,而B客户买了三件东西,这两个客户必须使用不同的session才能准确的记录所购买的东西。要实现这样的效果,需要在每次新建一个session时记录下浏览器的编号,使一个浏览器对应一个session,每次使用session时,浏览器传给服务器自己的sessionID,就可以找到正确的数据。 session有两种实现方式,一是由cookie实现,二是重写URL实现 cookie实现:既然每次访问需要sessionID,可以把浏览器的ID放在临时cookie中,大多数session都由此实现,代码示例如下 request.getSession(true) //参数为true表示如果没有session则创建,有则返回session;参数为false若没有则不创建 session.setAttribute("username", "liutao"); //和cookie一样的储存结构//获取Session
HttpSession session = request.getSession();
Object username = session.getAttribute("username");
System.out.println("username:"+username);
重写URL:若浏览器不支持cookie,则需要在页面中的每个链接都用response.encodeURL()方法重写URL,这种方法比较麻烦,甚至有些公司干脆没有这个步骤,必须需要用户打开cookie才能正常使用。
7.jsp中用javabean
javabean广义上指所有的java类,狭义上指满足sun定义的具有某种特性的类:
- 提供一个默认的无参构造函数。
- 需要被序列化并且实现了Serializable接口。
- 可能有一系列可读写属性。
- 可能有一系列的"getter"或"setter"方法。
jsp中使用的是狭义的javabean,具体语法见下面的代码示例
public class StudentsBean implements java.io.Serializable { private String firstName = null; private String lastName = null; private int age = 0; public StudentsBean() { } public String getFirstName(){ return firstName; } public String getLastName(){ return lastName; } public int getAge(){ return age; } public void setFirstName(String firstName){ this.firstName = firstName; } public void setLastName(String lastName){ this.lastName = lastName; } public void setAge(int age) { this.age = age; } } <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <html> <head> <title>get 和 set 属性实例</title> </head> <body> <jsp:useBean id="students" class="StudentsBean"> <jsp:setProperty name="students" property="firstName" value="小强"/> <jsp:setProperty name="students" property="lastName" value="王"/> <jsp:setProperty name="students" property="age" value="10"/> </jsp:useBean> <p>学生名字: <jsp:getProperty name="students" property="firstName"/> </p> <p>学生姓氏: <jsp:getProperty name="students" property="lastName"/> </p> <p>学生年龄: <jsp:getProperty name="students" property="age"/> </p> </body> </html>
本文章很浅层的总结了一些servlet和jsp知识,深度学习还需参考其他资料
参考链接:http://how2j.cn/
