java web开发入门一(servlet和jsp)基于eclispe

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-INF\lib\下,然后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>

 

posted @ 2019-11-23 11:25  梦亦晓  阅读(495)  评论(0编辑  收藏  举报