项目要求学习j2ee,先从servlet和JSP学起,这是后面框架的基础。
一、简介
学习一项新技术之前,先要搞明白这项技术是什么、为什么要学。
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
>
</
p
>
<%@ 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文件,并且用这种方法还可以像函数一样传递参数
如
下面是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
//获取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/