Servlet,jsp,JSP技术 ,JSP编程

Posted 玉广Blog

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Servlet,jsp,JSP技术 ,JSP编程相关的知识,希望对你有一定的参考价值。

 .Servlet

思考

1 浏览器可以直接打开JAVA/class文件吗? 不可以

2浏览器可以打开HTML、JS 文件吗? 可以

3 JAVA程序可以生成HTML文件吗?可以的,用IO流。

4 浏览器解析的时候是需要HTTP协议的,JAVA普通类有没有HTTP协议呢? 普通类没有.

 

JAVA-(class)浏览器如何访问呢?

浏览器---html

A   JAVA通过IO流生成HTML--->浏览器

B   JAVA 需要加入HTTP协议

解决上面2个问题可以通过 Servlet

C  如何通过浏览器访问Servlet

   它需要用到一个文件web.xml (webroot-->web-inf--web.xml)

   

Sevlet它是什么?

  Servlet是一个容器(引擎),它包含协议和支持功能的jar包,它是一个整体。

在使用的时候我们不用去关心里面的核心程序,我们只关心业务程序。

业务程序   程序员所写支持协议的类,有一种特殊的叫法 Serlvet类。

 

1.三要素是什么

入口(login.html)     处理(LoginServlet.java)  出口 (success.jsp)

2.如何访问servlet

  http://IP:port/project/urlpattern

  urlpattern ---->web.xml中找

 

3 request 和 response的区别?

Request请求  Broswer---->Tomcat    login.html--->LoginSevlet.java

Response返回 Tomcat---->Broswer   

 

4 doGet  和  doPost的区别?

   doGet   <a href=url>  超链接用的默认方式 get   不解中文决乱么

            <form action=url  method=get >

           明文传递方式 浏览器中可以看到传递的信息

           不安全,并且数据量大的时候会缺损数据

   doPost   <form action=url  method=post >        解决中文乱码

            密文传递方式 浏览器看不到传递的信息

           安全,并且数据量大的时候不会缺损数据

 

5如何解决乱码问题?

Request请求有乱码    

request.setCharacterEncoding("UTF-8");

Reponse返回有乱

response.setCharacterEncoding("UTF-8");

 

6 如何取得请求中的值 ?

String value=request.getParameter(“控件名”);   单个值

String []  values=request.getParmeterValues(“控件名”);  同名多个值

 

7 常见的错误:404 、500?

404 路径错误---解决思路  跟踪路径

500 代码错误---解决思路  jsp/servlet中代码错误

获取不到值null  在console里面去找到错误的位置。

 

8 servlet中得到流的方法?

   字符流   response.getWriter( )----->PrintWriter

   字节流   response.getOutputStream()-->OutputStream

 

9 如何跳转到出口?

//跳转并且可以传递数据

request.getRequestDispatcher("success.jsp").forward(request, response);

 

//重新定向 跳转不传递数据

response.sendRedirect("success.html");

 

10如何将数据传递到出口?

 //保存数据

request.setAttribute("name", username);

request.setAttribute("password", pwd);

 

 //获取数据

 用户名是:${ name}   ,密码: ${password}。

 

11 Servlet的生命周期

   Servlet的生命周期是由tomcat服务器来控制的。

  1 构造方法:

创建servlet对象的时候调用。默认情况下,第一访问servlet就会创建servlet对象只创建一次。说明servlet对象在tomcat中是单实例的。

 

 2初始化   init方法

  当创建完servlet对象的时候会调用init()方法,只调用一次。

 

3 调用服务 service 方法   其中就包含doGet  doPost等方法

  每次发送请求的时候调用。可以调用n次。

4 销毁 destory 方法

   销毁servlet对象的时候调用,停止服务器或者重新部署的web项目的时候销毁servlet就会调用destory方法

 

12 Servlet时序图

 

13 servlet自动加载

在web.xml中加入

  <load-on-startup> 1</load-on-startup>

里面的数字越小加载级别越高

当tomcat启动的时候,就去运行web.xml解析里面的内容,当发现有自动加载的数据时候,就会运行加载。

  <servlet>

    <servlet-name>sl</servlet-name>

    <servlet-class>com.bw.servlet.LoginServlet</servlet-class>

      <load-on-startup>3</load-on-startup>

  </servlet>

 

14 ServletConfig 对象

   主要是加载servlet的初始化参数,在web应用中可以存在多个ServletConfig对象

  

  <servlet>

    <servlet-name>sl</servlet-name>

    <servlet-class>com.bw.servlet.LoginServlet</servlet-class>

     <init-param>

      <param-name>username</param-name>

      <param-value>godyang</param-value>

    </init-param>

    <init-param>

      <param-name>password</param-name>

      <param-value>123456</param-value>

    </init-param>

  </servlet>

 

15 ServletContext对象

 上下文对象,表示当前的web应用(项目)环境。一个web应用只有一个ServletContext对象

 

  上下文参数配置  它是全局的  所有的servlet都可以访问

<context-param>

<param-name>ecode</param-name>

<param-value>UTF-8</param-value>

</context-param>

// 获取上下文对象

ServletContext sc = this.getServletContext();

String contextParamValue = sc.getInitParameter("ecode");

System.out.println("contextParamValue=" + contextParamValue);

//项目路径

String path=sc.getContextPath();

System.out.println("path="+path);

//文件发布后(tomcat/webapps)的真实路径

String realPath=sc.getRealPath("counter.txt");

System.out.println("realPath="+realPath  );

//获取文件流

     InputStream  is=sc.getResourceAsStream("C:\\\\Tomcat\\\\webapps\\\\webThree\\\\WEB-INF\\\\classes\\\\counter.txt");

 

 

二.JSP技术

Jsp技术是用来开发java web的页面显示的,所有MVC模型里面的视图层,所以视图层的开发
jsp不是编程语言,java server pages的缩写
Jsp其实也是继承Servlet的,属于在服务器上的开发。Servlet是用于java语言的动态资源开发的技术,而Jsp是把java和html结合,在html中可以写java语言,主要用在页面的显示开发上。

1.1.Jsp的特点

1.Jsp的运行必须交给tomcat服务器。tomcat的work目录就是服务器用来存放jsp运行时的临时文件的
2.Jsp页面即可直接写html代码,也可以直接写java代码

 

2.Jsp的执行过程
问题1:访问http://localhost:8080/hello/index.jsp 如何显示效果?
1.访问到index.jsp页面,tomcat扫描到jsp文件,在tomcat/work目录下把jsp文件翻译成java源文件

    index.jsp-->index_jsp.java(翻译)

2.tomcat服务器把java源文件编译成class字节码文件(编译)

  index_jsp.java-->index_jsp.class

3.tomcat服务器构造index_jsp类对象
4.tomcat服务器调用index_jsp类里面的方法,返回内容显示到浏览器
如果是第一次访问当前jsp文件时,执行步骤是:1-->2-->3-->4
第N次访问jsp时,执行步骤是:4,不再执行其他步骤

注意:jsp文件被修改或者jsp的临时文件被删除了,要重新走翻译 1 和编译 2  的过程

问题2:既然jsp是servlet,那么jsp的生命周期和servlet的生命周期是不是一样的?
当jsp文件被翻译成java的源码时,可以在翻译出来的源码文件里看到当前访问的jsp文件继承HttpJspBase类,再通过查询JDK,可以发现HttpJspBase又是继承于HttpServlet的。所以,可以得到结论,jsp既是一个servlet的程序,而servlet的技术可以用在jsp程序中,但是并不是所有的servlet技术全部适用于jsp程序

Servlet的生命周期:
1.构造方法(第一次访问执行)默认情况第一次使用的时候 通过单例模式创建一个servlet对象
2.init方法初始化(第一次访问执行)当构造了之后就会调用初始化方法 只调用一次
3.service方法(每n次访问都会执行)每次发出请求的时候调用可以调用n次
4.destory方法(退出时执行)关闭服务软件重新部署的时候销毁 servlet对象

 
Jsp的生命周期:
1.翻译:Jsp-->java文件
2.编译:java-->class文件(servlet程序)
3.构造方法(第一次访问时执行)
4.init方法(第一次访问):_JspInit()
5.service方法:_JspService()
6.destory方法:_jspDestory()

 

问题3:JSP和Servlet作用有什么区别?

1.Servlet作用: 用java语言开发动态资源(  java 流 )的技术.

2.JSP 作用:用java语言开发动态(java 流)+静态资源(html)的技术

 

3.Jsp语法


3.1.Jsp模板
JSP 页面中会自动添加HTML代码内容,该JSP是模板
这些模板定义了网页的基本骨架,也就是说定义了页面的结构和外观
3.2.Jsp表达式
JSP的表达式作用是向浏览器输出变量的值或表达式计算的结果

    语法:<%=变量或表达式 %>
    例如<% String name="Eric";%>

<%=name%>
注意:
1.表达式的原理即使翻译成out.print("变量“);通过该方法向浏览器写出内容。
2.表达式后面不需要带分好结束


3.3.Jsp的脚本

脚本是指在JSP页面编写多行java代码的,可以执行java代码
    语法:<%多行java代码; %>

如:

 <%
      Date date = new Date();
        
      SimpleDateFormat sdFormat = new SimpleDateFormat("yyyy-MM-dd");
    
      String now = sdFormat.format(date);
    
    out.println(now);
    
    %>
注意
1.原理是把脚本中的java代码原封不动的拷贝到jspService方法中执行
2.jsp脚本中写的java是需要加分好的,语法跟java语法是一样的
3.多个脚本片段中的代码可以相互访问
4.单个脚本片段中的java语句可以是不完整的,但是,多个脚本片段组合后的结必须是完整的java语句

3.4.Jsp的声明
JSP的声明是用来声明变量或者方法的,如果在index.jsp页面内声明一个变量或者方法,则该变量或者方法是index_jsp类的成员变量,成员方法,即是全局变量。这个其实就是在类中写好方法,然后可以在jsp_service方法中调用其他方法。
jsp通过脚本也可以定义一个变量,但是这个变量是保存在index_jsp类下的jspService方法下的一个变量,由于是保存在方法下面,所有脚本里是不可以定义一个方法的,只能通过声明来定义方法。
注意以上两者的区别,一个是保存在类下面,称为成员变量或者成员方法,另一个则是保存在方法中,称之为局部变量

    语法:<%! 变量或方法%>

作用:声明JSP的变量和方法
注意:
1.变量翻译成成员变量,方法翻译成成员方法

3.5.Jsp的注释

jsp的注释格式:

    jsp的注释:<%!--jsp注释 --%>
    html的注释:

注意:
1.html的注释会被翻译和执行,无论在jsp的页面翻译之后的源码还是在浏览器上查看网站的源码,都是可以查看到的。但是jsp的注释是不会被翻译和执行的,在翻译之后源码里是不能找到的,从浏览器查看源码也是查看不到的

 

4.Jsp的三大指令

JSP指令是为JSP引擎而设计的,他们并不产生任何可见的输出,只是告诉引擎如何处理jsp页面中的其余部分。jsp定义的有三大指令,分别是:include,page,tagllb

4.1.Include指令

Include指令的作用是当前页面包含其他页面,主要是导入其他jsp文件

    语法:<%@include file="common/header.jsp%>

注意
1.原理是把被包含的页面(header.jsp)的内容翻译到包含页面(index.jsp)中,合并并翻译成一个java源文件,再编译运行!!,这种包含就加叫静态包含(源码包含)
2.如果使用静态包含,被包含页面中不需要出现全局的html标签了,(如html,body,head)

4.2.page指令
page指令的作用是告诉tomcat服务器如何翻译jsp文件
                      
    语法:<%@ page contentType="text/html;charset=UTF-8" language="java" %>

 

<%@ page 

language="java"        --使用的语言

import="java.util.*"   --需要导入的类

pageEncoding="UTF-8"   --jsp编码方式

contentType="text/html; charset=UTF-8" --tomcathtml流发送给浏览器的文件类型和编码方式

errorPage="error.jsp"   --当前jsp页面解析错误的时候就会跳转到error.jsp

isErrorPage="false"  --当前页面是不是错误导向页面

 %>

 language="java"--告诉服务器只用什么动态语言来翻译jsp文件
import="java.util.*" --告诉服务器java文件使用什么包,导入多个包时,用逗号隔开
pageEncoding="utf-8" --告诉服务器使用什么编码把jsp翻译成java文件
contentType="text/html; charset=utf-8" --服务器发送浏览器的数据类型和内容编码,在开发工具中,只需要设置pageEncoding即可解决中文乱码的问题
errorPage="error.jsp" --如果当前页面出现错误信息,则自动调用此处指定的错误页面
isErrorPage="false" --意思是当前页面为错误页面,默认为false,当设置为true时就认为是一个错误处理页面,就可以在页面中使用<%=exception.getMessage()%>方法来获取错误异常信息,使其在页面上可以显示
全局配置错误处理页面
在web.xml中配置如下:
    <!--全局错误处理页面配置-->
    <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>

配置之后,不用在jsp页面中特别指明,会自动跳转的
session="true" --是否开启Session功能,false时不能使用Session内置对象,ture时可以使用。默认为true
buffer="8kb" --页面的缓存区大小。
isELIgnored="false" --是否忽略EL表达式。

page==this 对象 一般用在编译指令中 <%@ page   %>

4.3.tagllb指令

 语法<%taglib  %>

   作用:标签指令 用来解析标签效果

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

5.JSP的内置对象

5.1.什么是内置的对象
service开发中会经常用到一些常用的类比如:HttpSession, ServletConfig, ServletContext, HttpServletRequet,用的时候,我们会直接创建就可以了,但是在jsp中这会经常使用到这些类。为了开发的方便,sun公司在设计jsp的时候,在jsp页面加载完毕以后就自动帮开发者创建好了这些对象,而开发者只需要直接使用这些对象就可以了,那么这些已经创建好的对象有一个统一的名字叫做内置对象,内置对象一共有九个

例如:
在Service中要使用Session,需要先HttpSession session = request.getSession(true); 来创建一个Session对象,然后在使用对象的方法
但是在JSP中,可以直接使用Session的方法,如session.getId();

 

九大内置对象

jsp

servlet

 

对象名

类型

使用范围

request

HttpServletRequest

请求 浏览器--->服务器

response

HttpServletResponse

返回 服务器--->浏览器

config

ServletConfig

用来获取web.xml中的信息

application

ServletContext

整个项目中的全局信息

exception

Thrawable

捕获异常 try/catch  throws

page

this

当前对象,当前页面对象

out

JspWriter---->PrintWriter

当前页面输出流

pageContext

PageContext

当前页面的上下文,整个页面

Session

HttpSession

会话  浏览器和服务器通讯


即:
1.对象名(request)-->类型HttpServletRequest :HTTP请求的时候使用到
2.对象名(response)-->类型HttpServletResponse :HTTP响应的时候用到
3.对象名(config)-->类型ServletConfig :获取属于自己的参数
4.对象名(application)-->类型ServletContext :获取全局参数

5.对象名(exception)-->类型Throwable :异常
6.对象名(page)-->类型 Object(this) :本jsp对象
7.对象名(out)-->类型JspWriter :打印到浏览器
8.对象名(pageContext)-->类型PageContext

9.对象名(session)-->类型HttpServletSession :会话管理使用

 


5.2.Out对象

out  对象  JspWriter 带缓冲的PrinterWriter  就是输出流 , 使用范围是当前页面,超出了当前页无效

1.PrintWriter: 直接向浏览器输出内容
用write直接向浏览器(输出)写出内容

2.JspWrite: 向Jsp 缓冲区写内容
用write向jsp的缓冲区写内容,当缓冲区满足一下条件的时候,把内容一起写到浏览器上,性能高于PrintWriter
当满足一下条件之一,JSP缓冲区内容写出到浏览器:
   (1) 缓冲区满了
    (2)刷新缓存去:out.flush();
    (3)关闭缓冲区:buffer="0kb";
    (4)执行完毕JSP页面

‘out.print()

‘out.println();


5.3.pageContext对象

前面已经有了8个内置对象,这些对象都是在jsp_service方法中被创建的,然后直接使用,但是由于是在方法中被创建,属于局部变量,所以很难在其他方法被调用,所有,使用了PageContext把这八个内置对象封装起来,这样传参的时候只需要传一个就可以了,然后通过这个PageContext来调用
除了调用其他八个内置对象意外,PageContext本身也是一个域对象,可以传递参数,准确的说PageContext是jsp的上下文对象,只可以在当前jsp文件内传参

分别介绍PageContext的两个方法:
1.可以获取其他八个内置对象
源码分析:

public class 01_hello_jsp {
                    public void _jspService(request,response){
                        创建内置对象
                        HttpSession session =....;
                        ServletConfig config = ....;

                        把8个经常使用的内置对象封装到PageContext对象中
                        PageContext pageContext  = 封装;
                        调用method1方法
                        method1(pageContext);
                    }
                    
                    public void method1(PageContext pageContext){
                        希望使用内置对象
                        从PageContext对象中获取其他8个内置对象
                        JspWriter out =pageContext.getOut();
                        HttpServletRequest rquest =     pageContext.getRequest();
                        ........
                    }
            }

注意:调用的时候,使用getout,getrequest等方法来调用
使用场景:在自定义标签的时候,PageContext对象对象频繁使用到

2.PageContext本身就是一个域对象
经常使用的域对象有4个,分别是
ServletContext           context域
HttpServletRequest    request对象
HttpSession               session域
PageContex               page域

PageContext域的作用是保存数据和获取数据,用于共享数据
常用方法如下:
保存数据
1.默认情况下,保存到page域
pageContext.setAttribute("name");

2.可以向四个域对象保存数据
pageContext.setAttribute("name",域范围常量)

获取数据
1.默认情况下,从page域获取
 pageContext.getAttribute("name")

2.可以从四个域中获取数据

pageContext.getAttribute("name",域范围常量)

3.自动在四个域中搜索数据
    pageContext.findAttribute("name");
    顺序: page域 -> request域 -> session域- > context域(application域)

5.4.page对象 page==this 对象 一般用在编译指令中 <%@ page   %>

 

5.5.request对象 

request 请求  浏览器到服务器

当前请求存属性值

request.setAttribute("name","godyang");

当前请求取值

request.getAttribute("name")

请求传递参数

<a href="b.jsp?name=shunshun">  b.jsp</a>

或者

  <form  action="b.jsp"  method=post  >

   <input  type=text name="name" value="shunshun" />

   </form>

 

取得请求参数的值

request.getParameter(参数名);  request.getParameterValues(参数名)

 

5.6.reponse 对象
reponse  返回  服务器返回到浏览器

 

获取返回流

PrintWriter out = response.getWriter();

返回内容形式

response.setContentType("text/html");

返回的编码

response.setCharacterEncoding("UTF-8");

以上是关于Servlet,jsp,JSP技术 ,JSP编程的主要内容,如果未能解决你的问题,请参考以下文章

Java EE JSP编程基础

JSP和Servlet的区别和联系

(Servlet+Jsp)Web编程笔记(一套就够了)

jsp,servlet的基本原理和作用

jsp基础

JSP编程

(c)2006-2024 SYSTEM All Rights Reserved IT常识