zoukankan      html  css  js  c++  java
  • 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-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>
  • 相关阅读:
    C#调试信息打印到输出窗口
    C#拼接SQL中in条件
    从图像到知识:深度神经网络实现图像理解的原理解析
    Cocoa Touch(六):App运行机制 NSRunLoop, KVC, KVO, Notification, ARC
    Cocoa Touch(五):网络请求 NSURLSession/AFNetworking, GCD, NSURLResquest
    JQuery:选择器、动画、AJAX请求
    Cocoa Touch(四): 多线程GCD, NSObject, NSThread, NSOperationQueue
    Socket、RPC通信实例,简单版本,仅供查阅
    Cocoa Touch(三):图形界面UIKit、Core Animation、Core Graphics
    Cocoa Touch(二):数据存储CoreData, NSKeyArchiver, NSOutputStream, NSUserDefaults
  • 原文地址:https://www.cnblogs.com/eggTwo/p/11822248.html
Copyright © 2011-2022 走看看