servlet

用java语言开发动态资源网站的技术,在doGet方法中拼接显示html,在doPost方法中提交数据。类似于.net的ashx技术。

servlet生成的class文件存放在tomcat中webapps目录下。

1.开发一个servlet步骤:

  1)在src下新建包并编写java类,继承HttpServlet类

  2)重写doGet和doPost方法

  1. package com.eggtwo.boss;
  2.  
  3. import java.io.IOException;
  4. import javax.servlet.ServletException;
  5. import javax.servlet.annotation.WebServlet;
  6. import javax.servlet.http.HttpServlet;
  7. import javax.servlet.http.HttpServletRequest;
  8. import javax.servlet.http.HttpServletResponse;
  9.  
  10. @WebServlet("/test")
  11. public class TestServlet extends HttpServlet {
  12. private static final long serialVersionUID = 1L;
  13.  
  14. public TestServlet() {
  15. super();
  16. }
  17.  
  18. protected void doGet(HttpServletRequest request, HttpServletResponse response)
  19. throws ServletException, IOException {
  20.  
  21. response.getWriter().append("Served at: ").append(request.getContextPath());
  22. }
  23.  
  24. protected void doPost(HttpServletRequest request, HttpServletResponse response)
  25. throws ServletException, IOException {
  26. doGet(request, response);
  27. }
  28.  
  29. }

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页面。

  1. <%@page import="java.util.Date"%>
  2. <%@ page language="java" contentType="text/html; charset=ISO-8859-1"
  3. pageEncoding="ISO-8859-1"%>
  4. <!DOCTYPE html>
  5. <html>
  6. <head>
  7. <meta charset="ISO-8859-1">
  8. <title>Insert title here</title>
  9. </head>
  10. <body>
  11. <%
  12. out.write("hello");
  13. Date dt=new Date();
  14. String s=dt.toLocaleString();
  15. %>
  16. <h3><%=s %></h3>
  17. </body>
  18. </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文件

  1. <%@ page
  2. language="java" --告诉服务器使用什么动态语言来翻译jsp文件
  3. import="java.util.*" --告诉服务器java文件使用什么包导入包,多个包之间用逗号分割
  4. pageEncoding="utf-8" --告诉服务器使用什么编码翻译jsp文件(成java文件)
  5. contentType="text/html; charset=utf-8" 服务器发送浏览器的数据类型和内容编码,注意:在开发工具中,以后只需要设置pageEncoding即可解决中文乱码问题
  6. errorPage="error.jsp" --指定当前jsp页面的错误处理页面。
  7. isErrorPage="false" --指定当前页面是否为错误处理页面。false,不是错误处理页面,则不能使用exception内置对象;true,是错误处理页面,可以使用exception内置对象。
  8. buffer="8kb" --jsp页面的缓存区大小
  9. session="true" --是否开启session功能。false,不能用session内置对象;true,可以使用session内置对象。
  10. isELIgnored="false" --是否忽略EL表达式
  11. %>

配置全局的错误处理页面:

在web.xml中的web-app节点下配置:

  1. <!-- 全局错误处理页面配置 -->
  2. <error-page>
  3. <error-code>500</error-code>
  4. <location>/common/500.jsp</location>
  5. </error-page>
  6. <error-page>
  7. <error-code>404</error-code>
  8. <location>/common/404.html</location>
  9. </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:在整个服务器上保存,所有用户都可使用。 重启服务器后无效

  1. <%
  2. pageContext.setAttribute("age", 18);
  3. pageContext.setAttribute("tom", 11,pageContext.REQUEST_SCOPE);
  4. request.setAttribute("name","jack");
  5. session.setAttribute("lily", 12);
  6. application.setAttribute("全局",12);
  7.  
  8. %>
  9. <h1>${name}</h1>
  10. <h1>${tom}</h1>
  11. <h1>${age}</h1>
  12. <h1>${lily}</h1>
  13. <h1>${全局}</h1>

域对象保存值,取值,删除的方法

  1. //设置值
  2. pageContext.setAttribute("age", 18);
  3. //取值
  4. Object obj=pageContext.getAttribute("age");
  5. if(obj==null){
  6. out.write("已删除");
  7. }else{
  8. //数字直接试用out.write输出会乱码
  9. int age=Integer.parseInt(obj.toString());
  10. out.write(Integer.toString(age));
  11. //或者
  12. //out.write(obj.toString());
  13. }
  14. out.write("<br/>");
  15. pageContext.removeAttribute("age");
  16. Object obj1=pageContext.getAttribute("age");
  17. if(obj1==null){
  18. out.write("已删除");
  19. }else{
  20. out.write(obj1.toString());
  21. }

注意:如果设置过多的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

  1. <jsp:forward page="second.jsp">
  2. <jsp:param value="name" name="jack"/>
  3. </jsp:forward>

等同于

  1. request.getRequestDispatcher("second.jsp?name=jack").forward(request, response);

包含标签:  <jsp:include/>

  1. <%@include file="common.jsp" %>
  2. <jsp:include page="comm.jsp">
  3. <jsp:param value="name" name="jack"/>
  4. </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页面导入核心标签库:

  1. <%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>

3)在jsp中使用jstl标签

保存数据:  <c:set></c:set>

  1. <%--
  2. set标签:保存值到域中
  3. var:值的名称
  4. value:值
  5. scope:值的范围,page,request,session,application
  6. --%>
  7. <c:set var="sex" value="man" scope="request"></c:set>

获取数据:<c:out value=""></c:out>

  1. <%--
  2. out标签:获取域中设置的数据
  3. default:当valuenull时,使用默认值
  4. escapeXml:是否对value进行转义,false不转义,true转义
  5. --%>
  6. <c:out value="${sex}" default="<h1>默认值</h1>" escapeXml="true"></c:out>

单条件判断: <c:if test=""></c:if>

  1. <%--if标签:单条件判断 --%>
  2. <c:if test="${5>3}">

多条件判断:

<c:choose></c:choose>

<c:when test=""></c:when>

<c:otherwise></c:otherwise>

  1. <c:set var="score" value="80"></c:set>
  2. <c:choose>
  3. <c:when test="${score>90}">
  4. 优秀
  5. </c:when>
  6. <c:when test="${score<=90&&score>60}">
  7. 良好
  8. </c:when>
  9. <c:otherwise>

  10. </c:otherwise>
  11. </c:choose>

循环数据:

<c:forEach></c:forEach>

  1. <%
  2. ArrayList<String> list=new ArrayList<String>();
  3. list.add("tom");
  4. list.add("jack");
  5. list.add("jack");
  6. pageContext.setAttribute("list", list);
  7. %>
  8. <%--forEach循环
  9. begin:从哪个元素开始,默认从0开始
  10. end:到哪个元素结束
  11. step:每次的增量
  12. items:要遍历的数据
  13. var:每个元素的名称
  14. varStatus:正在遍历的元素的状态对象,count属性默认从1开始
  15. --%>
  16. <c:forEach begin="0" end="2" step="1" items="${list}" var="names" varStatus="varSta">
  17. <h4>顺序:${varSta.count},${names}</h4>
  18. </c:forEach>

<c:forTokens items="" delims="" var=""></c:forTokens>

  1. <%
  2. String sps="a-b-c";
  3. pageContext.setAttribute("sps",sps);
  4. %>
  5. <c:forTokens items="${sps}" delims="-" var="ss">
  6. <h5>${ss}</h5>
  7. </c:forTokens>

重定向:<c:redirect url=""></c:redirect>

  1. <c:redirect url="http://www.baidu.com"> </c:redirect>

7.4 自定义标签

开发步骤:

1.

编写一个普通的java类,继承SimpleTagSupport类,叫标签处理器类

  1. public class ShowIpTag extends SimpleTagSupport {
  2.  
  3. @Override
  4. public void doTag() throws JspException, IOException {
  5. // 向浏览器输出客户的ip地址
  6. PageContext pageContext = (PageContext) getJspContext();
  7.  
  8. HttpServletRequest request = (HttpServletRequest) pageContext.getRequest();
  9.  
  10. String ip = request.getRemoteHost();
  11.  
  12. JspWriter out = pageContext.getOut();
  13.  
  14. out.write("使用自定义标签输出客户IP地址:" + ip);
  15.  
  16. }
  17.  
  18. }

2)在web项目的WEB-INF目录下建立eggtwo.tld文件,这个tld叫标签库的声明文件。(参考核心标签库的tld文件)

  1. <?xml version="1.0" encoding="UTF-8" ?>
  2.  
  3. <taglib xmlns="http://java.sun.com/xml/ns/javaee"
  4. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  5. xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-jsptaglibrary_2_1.xsd"
  6. version="2.1">
  7. <!-- 标签库版本 -->
  8. <tlib-version>1.1</tlib-version>
  9. <!-- 标签库前缀版本 -->
  10. <short-name>eggtwo</short-name>
  11. <!--tld文件的唯一标记,完整的uri -->
  12. <uri>http://tag.eggtwo.com</uri>
  13. <tag>
  14. <!--标签名称tld文件的唯一标记 -->
  15. <name>showIp</name>
  16. <!--标签处理器类的全称(包名+类名) -->
  17. <tag-class>com.eggtwo.boss.ShowIpTag</tag-class>
  18. <!--输出内容的格式 -->
  19. <body-content>scriptless</body-content>
  20.  
  21. </tag>
  22. </taglib>

3) 在jsp页面的头部导入自定义标签库

  1. <%@taglib prefix="eggtwo" uri="http://tag.eggtwo.com" %>

4) 在jsp中使用自定义标签

  1. <eggtwo:showIp></eggtwo:showIp>

java web开发入门一(servlet和jsp)基于eclispe的更多相关文章

  1. java web开发入门二(struts)基于eclispe

    JavaBean JavaBean,  咖啡豆. JavaBean是一种开发规范,可以说是一种技术. JavaBean就是一个普通的java类.只有符合以下规定才能称之为javabean: 1)必须提 ...

  2. SpringMVC内容略多 有用 熟悉基于JSP和Servlet的Java Web开发,对Servlet和JSP的工作原理和生命周期有深入了解,熟练的使用JSTL和EL编写无脚本动态页面,有使用监听器、过滤器等Web组件以及MVC架构模式进行Java Web项目开发的经验。

    熟悉基于JSP和Servlet的Java Web开发,对Servlet和JSP的工作原理和生命周期有深入了解,熟练的使用JSTL和EL编写无脚本动态页面,有使用监听器.过滤器等Web组件以及MVC架构 ...

  3. java web 开发入门 --- tomcat/servlet/jsp

    在做java web 开发时,要先安装tomcat.它是一个web服务器,也叫web容器,我们把写好的jsp, html页面放到它里面,然后启动它,就可以用浏览器访问这些页面,地址栏中输入localh ...

  4. java web开发入门四(spring)基于intellig idea

    spring 1.spring简介 Spring框架,可以解决对象创建以及对象之间依赖关系的一种框架. 且可以和其他框架一起使用:Spring与Struts,  Spring与hibernate (起 ...

  5. java web开发入门七(mybatis)基于intellig idea

    mybatis 一. 入门开发步骤 1.导入相关jar包 mybatis3.4.2核心开发包 asm-5.1.jarcglib-3.2.4.jarcommons-logging-1.1.3.jarlo ...

  6. java web开发入门三(Hibernate)基于intellig idea

    Hibernate 1.开发流程 项目配置好后的结构: 1.下载源码: 版本:hibernate-distribution-3.6.0.Final 2.引入hibernate需要的开发包(3.6版本) ...

  7. day04 Java Web 开发入门

    day04 Java Web 开发入门 1. web 开发相关介绍 2. web 服务器 3. Tomcat服务器启动的问题 4. Tomcat目录结构 5. Web应用程序(虚拟目录映射,缺省web ...

  8. 【Java Web开发学习】Servlet、Filter、Listener

    [Java Web开发学习]Servlet 转发:https://www.cnblogs.com/yangchongxing/p/9274739.html 1.Servlet package cn.y ...

  9. JAVA WEB快速入门之从编写一个基于SpringBoot+Mybatis快速创建的REST API项目了解SpringBoot、SpringMVC REST API、Mybatis等相关知识

    JAVA WEB快速入门系列之前的相关文章如下:(文章全部本人[梦在旅途原创],文中内容可能部份图片.代码参照网上资源) 第一篇:JAVA WEB快速入门之环境搭建 第二篇:JAVA WEB快速入门之 ...

  10. java WEB开发入门

    WEB开发入门 1 进入web JAVASE:标准- standard   JAVA桌面程序 GUI    SOCKET JAVAEE:企业-浏览器控制  web 2 软件结构 C/S :client ...

随机推荐

  1. TransactionScope 使用的注意事项

    前两天为了给代码做一些事务封装,写了个小Demo,用TransactionScope代码块实现. 第一条更新成功后第二条刻意抛出异常,结果发现第一条总执行成功,这不符合预期,于是开始一步步跟踪调试. ...

  2. CTS,CLS,CLR解释

    问题阐述 CTS.CLS和 CLR分别是什么意思? 专家解答 CTS.CLS和 CLR是.NET框架的 3个核心部分,下面分别对它们进行介绍. (1)CTS CTS即通用类型系统,它定义了如何在.NE ...

  3. 在IIS下发布.Net Core MVC项目

    1. 默认你已经安装了IIS,并且创建了一个.Net Core 项目 2. 发布.NET Core项目 在vs中右键点击MVC项目,点击"发布"按钮,选择"文件系统&qu ...

  4. redis的两种持久化方案

    前言 人生在于折腾系列,网络,多线程等系列博客楼主还在继续折腾也不会放弃.缓存的知识其实并不仅仅在于简单的增删改查,我觉得有必要全面深入的学习一波.记录学习的过程与体悟. RDB 什么是RDB 对re ...

  5. js中的原型,原型链和继承

    在传统的基于Class的语言如Java.C++中,继承的本质是扩展一个已有的Class,并生成新的Subclass. 由于这类语言严格区分类和实例,继承实际上是类型的扩展.但是,JavaScript最 ...

  6. Chrome headless三种安装方法

    在使用chrome headless的时候,使用安装源有很多的依赖问题,提供三种方法,最简单的是使用一键安装脚本. 1.添加chrome源来安装chrome 添加源: ## 添加:vim /etc/y ...

  7. vue+element打印页面功能

    项目中遇到了要打印页面的功能,我感之前使用的是一个第三方的插件,但是不兼容IE,后来发现直接调用window的API就可以了,MMP // 打印表单 printBtn() { window.print ...

  8. C++ OpenSSL 之五:生成P12文件

    1.等同于使用: openssl pkcs12 -export -inkey "key_path" -in "pem_path" -out "save ...

  9. 3.redis 都有哪些数据类型?分别在哪些场景下使用比较合适?

    作者:中华石杉 面试题 redis 都有哪些数据类型?分别在哪些场景下使用比较合适? 面试官心理分析 除非是面试官感觉看你简历,是工作 3 年以内的比较初级的同学,可能对技术没有很深入的研究,面试官才 ...

  10. Linux磁盘查询指令

    磁盘情况查询: 查询系统整体磁盘使用情况: df -h 查询指定目录的磁盘占用情况 du -h /目录 查询指定目录的磁盘占用情况,默认为当前目录 -s  指定目录占用大小汇总 -h 带计量单位 -a ...