servlet
用java语言开发动态资源网站的技术,在doGet方法中拼接显示html,在doPost方法中提交数据。类似于.net的ashx技术。
servlet生成的class文件存放在tomcat中webapps目录下。
1.开发一个servlet步骤:
1)在src下新建包并编写java类,继承HttpServlet类
2)重写doGet和doPost方法
package com.eggtwo.boss; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @WebServlet("/test") public class TestServlet extends HttpServlet { private static final long serialVersionUID = 1L; public TestServlet() { super(); } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.getWriter().append("Served at: ").append(request.getContextPath()); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }
2.servlet的生命周期
构造方法: 创建servlet对象的时候调用。默认情况下,第一次访问servlet的时候创建servlet对象 只调用1次。证明servlet对象在tomcat是单实例的。
init方法: 创建完servlet对象的时候调用。只调用1次。
service方法: 每次发出请求时调用。调用n次。
destroy方法: 销毁servlet对象的时候调用。停止服务器或者重新部署web应用时销毁servlet对象。 只调用1次。
JSP
1.特点:
用java语言+html开发动态网站的技术。jsp就是servlet()。
类似于.net的webform,jsp页面可以java语言和html混合写。
tomcat的work目录存放jsp运行的临时文件(.java和.class文件),在运行jsp页面时动态生成并 执行。
访问方式:http://localhost:8080/javaweb/hello.jsp
2.创建方式:
在WebRoot下创建jsp页面。
<%@page import="java.util.Date"%> <%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%> <!DOCTYPE html> <html> <head> <meta charset="ISO-8859-1"> <title>Insert title here</title> </head> <body> <% out.write("hello"); Date dt=new Date(); String s=dt.toLocaleString(); %> <h3><%=s %></h3> </body> </html>
3.生命周期:
1)翻译: jsp->java文件
2)编译: java文件->class文件(servlet程序)
3)构造方法(第1次访问)
4)init方法(第1次访问):_jspInit()
5)service方法:_jspService()
6)destroy方法:_jspDestroy()
4.jsp语法
4.1jsp表达式:
语法:<%=变量或表达式%>
作用: 向浏览器输出变量的值或表达式计算的结果
注意:
1)表达式的原理就是翻译成out.print(“变量” );通过该方法向浏览器写出内容
2)表达式后面不需要带分号结束。
4.2jsp脚本
语法:<% java代码 %>
作用: 执行java代码
注意:原理把脚本中java代码原封不动拷贝到_jspService方法中执行,不能声明方法
4.3jsp的声明
语法:<%! 变量或方法 %>
作用: 声明jsp的变量或方法
注意:
1)变量翻译成成员变量,方法翻译成成员方法。
4.4jsp的注释
语法: <%-- jsp注释 --%>
注意;
1)html的注释会被翻译和执行。而jsp的注释不能被翻译和执行。
4.5jsp指令
include指令:
作用: 在当前页面用于包含其他页面,类似于.net mvc中的分布视图
语法: <%@include file="common/header.jsp"%>
注意:
1)原理是把被包含的页面(header.jsp)的内容翻译到包含页面(index.jsp)中,合并成翻译成一 个java源文件,再编译运行!!,这种包含叫静态包含(源码包含)
2)如果使用静态包含,被包含页面中不需要出现全局的html标签了!!!(如html、head、 body)
page指令:
作用: 告诉tomcat服务器如何翻译jsp文件
<%@ page language="java" --告诉服务器使用什么动态语言来翻译jsp文件 import="java.util.*" --告诉服务器java文件使用什么包导入包,多个包之间用逗号分割 pageEncoding="utf-8" --告诉服务器使用什么编码翻译jsp文件(成java文件) contentType="text/html; charset=utf-8" 服务器发送浏览器的数据类型和内容编码,注意:在开发工具中,以后只需要设置pageEncoding即可解决中文乱码问题 errorPage="error.jsp" --指定当前jsp页面的错误处理页面。 isErrorPage="false" --指定当前页面是否为错误处理页面。false,不是错误处理页面,则不能使用exception内置对象;true,是错误处理页面,可以使用exception内置对象。 buffer="8kb" --jsp页面的缓存区大小 session="true" --是否开启session功能。false,不能用session内置对象;true,可以使用session内置对象。 isELIgnored="false" --是否忽略EL表达式 %>
配置全局的错误处理页面:
在web.xml中的web-app节点下配置:
<!-- 全局错误处理页面配置 --> <error-page> <error-code>500</error-code> <location>/common/500.jsp</location> </error-page> <error-page> <error-code>404</error-code> <location>/common/404.html</location> </error-page>
5.jsp内置对象
JSP内置对象(9个内置对象):
1.pageContext javax.servlet.jsp.PageContext JSP的页面容器
2.request javax.servlet.http.HttpServletrequest 获取用户的请求信息
3.response javax.servlet.http.HttpServletResponse 服务器向客户端的回应信息
4.session javax.servlet.http.HttpSession 用来保存每一个用户的信息
5.application javax.servlet.ServletContext 表示所有用户的共享信息
6.config javax.servlet.ServletConfig 服务器配置信息,可以取得初始化参数
7.out javax.servlet.jsp.jspWriter 页面输出
8.page (java.lang.object)
9.exception java.lang.Throwable
4个域对象的范围:用于共享数据(设置、获取、删除)
page(pageContext):只在当前jsp页面中有效, 跳转之后无效。
request:只在一次请求中有效,服务器跳转(转发)之后有效。 客户端跳无效
session:在一次会话中有效。服务器跳转、客户端跳转都有效。 网页关闭重新打开无效
application:在整个服务器上保存,所有用户都可使用。 重启服务器后无效
<% pageContext.setAttribute("age", 18); pageContext.setAttribute("tom", 11,pageContext.REQUEST_SCOPE); request.setAttribute("name","jack"); session.setAttribute("lily", 12); application.setAttribute("全局",12); %> <h1>${name}</h1> <h1>${tom}</h1> <h1>${age}</h1> <h1>${lily}</h1> <h1>${全局}</h1>
域对象保存值,取值,删除的方法
//设置值 pageContext.setAttribute("age", 18); //取值 Object obj=pageContext.getAttribute("age"); if(obj==null){ out.write("已删除"); }else{ //数字直接试用out.write输出会乱码 int age=Integer.parseInt(obj.toString()); out.write(Integer.toString(age)); //或者 //out.write(obj.toString()); } out.write("<br/>"); pageContext.removeAttribute("age"); Object obj1=pageContext.getAttribute("age"); if(obj1==null){ out.write("已删除"); }else{ out.write(obj1.toString()); }
注意:如果设置过多的application属性范围会影响服务器性能。
pageContext.PAGE_SCOPE
pageContext.REQUEST_SCOPE
pageContext.SESSION_SCOPE
pageContext.APPLICATION_SCOPE
pageContext.setAttribute("name", "liuyang", pageContext.APPLICATION_SCOPE);
6.EL表达式
6.1 作用
jsp的核心语法: jsp表达式 <%=%>和 jsp脚本<% %>。
以后开发jsp的原则: 尽量在jsp页面中少写甚至不写java代码。
使用EL表达式替换掉jsp表达式
EL表达式作用: 向浏览器输出域对象中的变量值或表达式计算的结果!!!
语法: ${变量或表达式}
6.2EL语法
1)输出基本数据类型变量
1.1 从四个域获取
${name}
1.2 指定域获取
${pageScope.name}
1.3 输出对象属性:student.name 注意:.name 相当于 getName()方法,其中name和Name要对应
域范围: pageScoep / requestScope / sessionScope / applicationScope
2)处理集合${studentList[0].name}
3)表达式计算 ${10+1}
7.jsp标签
7.1 jsp标签作用:
替换jsp脚本
7.2 Jsp标签分类:
1)内置标签(动作标签): 不需要在jsp页面导入标签
2)jstl标签: 需要在jsp页面中导入标签
3)自定义标签 : 开发者自行定义,需要在jsp页面导入标签
内置标签(动作标签):
转发标签: <jsp:forward />
参数标签: <jsp:pararm/>
例如:内部跳转到second.jsp并带上参数name=jack
<jsp:forward page="second.jsp"> <jsp:param value="name" name="jack"/> </jsp:forward>
等同于
request.getRequestDispatcher("second.jsp?name=jack").forward(request, response);
包含标签: <jsp:include/>
<%@include file="common.jsp" %> <jsp:include page="comm.jsp"> <jsp:param value="name" name="jack"/> </jsp:include>
静态包含语法: <%@inclue file="被包含的页面"%>
动态包含语法: <jsp:include page="被包含的页面">
静态包含: 先合并再翻译
动态包含: 先翻译再合并
7.3 JSTL标签
JSTL (全名:java standard tag libarary - java标准标签库 )
五套标签库:
1.核心标签库 (c标签库) 天天用
2.国际化标签(fmt标签库)
3.EL函数库(fn函数库)
4.xml标签库(x标签库)
5.sql标签库(sql标签库)
使用JSTL标签步骤
1) Eclispe需要导入jstl支持的jar包(标签背后隐藏的java代码)注意:MyEclispe使用javaee5.0的项目自动导入jstl支持jar包
eclispe导入方式:将standard.jar和jstl.jar文件拷贝到工程的WEB-INFlib下,然后build path
2)使用taglib指令导入标签库 <%@taglib uri="tld文件的uri名称" prefix="简写" %>
例如:在jsp页面导入核心标签库:
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
3)在jsp中使用jstl标签
保存数据: <c:set></c:set>
<%-- set标签:保存值到域中 var:值的名称 value:值 scope:值的范围,page,request,session,application --%> <c:set var="sex" value="man" scope="request"></c:set>
获取数据:<c:out value=""></c:out>
<%-- out标签:获取域中设置的数据 default:当value为null时,使用默认值 escapeXml:是否对value进行转义,false不转义,true转义 --%> <c:out value="${sex}" default="<h1>默认值</h1>" escapeXml="true"></c:out>
单条件判断: <c:if test=""></c:if>
<%--if标签:单条件判断 --%> <c:if test="${5>3}">
多条件判断:
<c:choose></c:choose>
<c:when test=""></c:when>
<c:otherwise></c:otherwise>
<c:set var="score" value="80"></c:set> <c:choose> <c:when test="${score>90}"> 优秀 </c:when> <c:when test="${score<=90&&score>60}"> 良好 </c:when> <c:otherwise> 差 </c:otherwise> </c:choose>
循环数据:
<c:forEach></c:forEach>
<% ArrayList<String> list=new ArrayList<String>(); list.add("tom"); list.add("jack"); list.add("jack"); pageContext.setAttribute("list", list); %> <%--forEach循环 begin:从哪个元素开始,默认从0开始 end:到哪个元素结束 step:每次的增量 items:要遍历的数据 var:每个元素的名称 varStatus:正在遍历的元素的状态对象,count属性默认从1开始 --%> <c:forEach begin="0" end="2" step="1" items="${list}" var="names" varStatus="varSta"> <h4>顺序:${varSta.count},${names}</h4> </c:forEach>
<c:forTokens items="" delims="" var=""></c:forTokens>
<% String sps="a-b-c"; pageContext.setAttribute("sps",sps); %> <c:forTokens items="${sps}" delims="-" var="ss"> <h5>${ss}</h5> </c:forTokens>
重定向:<c:redirect url=""></c:redirect>
<c:redirect url="http://www.baidu.com"> </c:redirect>
7.4 自定义标签
开发步骤:
1.
编写一个普通的java类,继承SimpleTagSupport类,叫标签处理器类
public class ShowIpTag extends SimpleTagSupport { @Override public void doTag() throws JspException, IOException { // 向浏览器输出客户的ip地址 PageContext pageContext = (PageContext) getJspContext(); HttpServletRequest request = (HttpServletRequest) pageContext.getRequest(); String ip = request.getRemoteHost(); JspWriter out = pageContext.getOut(); out.write("使用自定义标签输出客户IP地址:" + ip); } }
2)在web项目的WEB-INF目录下建立eggtwo.tld文件,这个tld叫标签库的声明文件。(参考核心标签库的tld文件)
<?xml version="1.0" encoding="UTF-8" ?> <taglib xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-jsptaglibrary_2_1.xsd" version="2.1"> <!-- 标签库版本 --> <tlib-version>1.1</tlib-version> <!-- 标签库前缀版本 --> <short-name>eggtwo</short-name> <!--tld文件的唯一标记,完整的uri --> <uri>http://tag.eggtwo.com</uri> <tag> <!--标签名称tld文件的唯一标记 --> <name>showIp</name> <!--标签处理器类的全称(包名+类名) --> <tag-class>com.eggtwo.boss.ShowIpTag</tag-class> <!--输出内容的格式 --> <body-content>scriptless</body-content> </tag> </taglib>
3) 在jsp页面的头部导入自定义标签库
<%@taglib prefix="eggtwo" uri="http://tag.eggtwo.com" %>
4) 在jsp中使用自定义标签
<eggtwo:showIp></eggtwo:showIp>