• jsp技术入门


    Jsp的简称:java server page

    1. web资源的运行原理

    html: 静态web资源,DefaultServlet读取html文件,通过response输出给IE浏览器

    Servlet: 动态web资源,web容器(Servlet引擎)解析web.xml文件,找到url对应的java类

    通过反射创建Servlet对象,调用service方法

    Class.forName(“cn.itcast.servlet.Servlet1”).newInstance();

    jsp: 动态web资源

    jsp页面在第一次被访问的时候,web容器(jsp引擎)会将jsp翻译成一个Servlet,然后调用servlet的

    service方法 所以第一次访问的时候比较慢。

    jsp 翻译后的Servlet会被放到

    %tomcat安装目录%\work\Catalina\localhost\webcontext

    当jsp页面被再次访问的时候,web容器会去直接调用Servlet的 service方法,所以通常来讲 jsp 只是在第一次被访问的时候比较慢

    如果jsp页面做了修改,此时web容器会重新翻译jsp

    2. jsp 是什么

    实际上 jsp 就是 Servlet , 只是提供了一种比较直观的书写方式,因为写jsp就像在写Html

    jsp中可以写 java 代码, 有两种写法

    1) jsp 脚本表达式

    内容会被放到 out.print() 里面 输出个浏览器

    <%=new Date() %>

    Jsp脚本表达式,等号后面跟一行java代码,注意不能以分号结束。

    您的ip是:<%=request.getRemoteAddr() %>

    面试题:

    如何把一个数字转换成字符串?

    String.valueof

    Integer

    String.valueof和to string有什么区别?

    都是一样的。属于互相调用

    2) jsp脚本片段

    可以大量的写入java代码,输入多行java代码

    Jsp脚本片段内容会原封不动地被翻译到 Servlet 的service方法中

    <%

    // java 代码

    %>

    Jsp运行原理:ie访问一个jsp时,web容器会将jsp首先翻译成一个servlet,余下的过程和访问一个servlet完全一样。

    表达式被翻译到service方法中的out.print

    J

    3. jsp 和 Servlet的区别

    1) Servlet 适合写java代码,因为Servlet就是一个java类

    在开发中使用Servlet对用户发送的请求进行处理并做出响应

    2) jsp 适合做数据美化,作为 数据显示模板

    因为jsp页面直接书写HTML标签

    3) 项目中的web层通常使用mvc设计模式 Servlet+jsp+javabean

    其中, Servlet做控制器,处理用户请求

    jsp作为显示模板

    javabean 作为封装数据的实体

    4) 如何养成一种良好的编码风格

    在Servlet中应避免做任何的数据输出

    在 jsp 中应避免去直接书写java代码, 而实际上要做到这点很难, 所以需要用到 el 和 jstl

    (jsp 中必须要写的java代码,从域对象中取出数据)

    二、 jsp语法

    1. 模板元素

    在 jsp 页面中所有的 html 标签部分被称作模板元素,用于对整个网页进行布局

    2. jsp脚本

    jsp中的java代码被称作jsp脚本

    有三种形式

    1) 脚本表达式

    被翻译到 out.print() 方法中

    <%=new Date() %>

    2) 脚本片段

    被翻译到 service 方法中

    <%

    for(int i=0; i<10; i++) {

    System.out.println(i);

    }

    %>

    3) jsp 声明

    被翻译到 service 方法外面

    写成员变量\成员方法\静态代码块

    <%!

    private String name;

    static {

    .......

    }

    %>

    3. jsp指令

    include指令 用于包含一个页面

    taglib 指令用于引入标签库文件

    page指令 用于向jsp引擎说明jsp的页面情况

    page指令一般都放在页面的开头,但是不管放在哪都对整个页面起作用

    page指令 常用的主要有一下几个:

    1) import 导包, 导入多个包时需要以“,”隔开 也可以分作多条指令书写

    例如:<%@ page language="java" import="java.util.*" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>

    在这里自动导包的方法时,在单词的后面,点击alt+/,然后选择导包

    就ok了

    2) session 说明是否使用session

    默认值为true,被翻译的Serlvet中会自动获得Session
    如果将该值指定为false 被翻译的Servlet的service方法中将不获取session

    3) errorPage 指定错误跳转的页面

    在 web.xml 文件中同样可以配置错误页面

    可根据异常类型或错误编码进行配置

    error-page

    为了防止英文报错,直接把英文显示给用户,那么就配置错误提示页面:

    如果出错:为所有的jsp页面配置错误的跳转页面,在web.xml里面配置

    配置内容为:

    1.抓异常错误的

    <error-page>

    <exception-type>java.lang.ArithmeticException </exception-type>

    <location>/error.jsp</location>

    </error-page>

    1. 错误码

    <error-page>

    <error-code>404</error-code>

    <location>404.jsp</location>

    </error-page>

    *isErrorPage:true|false。指示是不是错误处理页面。是否产生exception对象

    *contentType="mimeType;charset=UTF-8":等同于response.setContentType();

    *pageEncoding:通知引擎在翻译jsp--》Servlet时使用的编码

    *isELIgnored:是否忽略EL表达式true|false。默认值false。true是忽略EL表达式

    4) pagaEncoding

    通知jsp引擎在翻译jsp的过程中以什么编码方式来解码jsp文件

    通知 Servlet引擎 response编码方式,相当于 response.setContentType()

    说白了

    只要给jsp指定了 pageEncoding=”utf-8”

    jsp引擎在翻译jsp时, 就会自动加上一句

    response.setContentType(“text/html;charset=utf-8”)

    扩展 : jsp 乱码问题

    在 tomcat6 以后jsp就没有乱码问题了, 如果是使用tomcat5 才会出现乱码问题

    1

    jsp 乱码解决 告诉jsp引擎jsp页面是什么码,这样翻译才不会错

    告诉response用什么码编码再发给浏览器

    产生乱码的原因

    1、JSP程序存在有与Servlet程序完全相同的中文乱码问题

    输出响应正文时出现的中文乱码问题 contentType=“text/html;charset=UTF-8”

    2、读取浏览器传递的参数信息时出现的中文乱码问题

    3、JSP引擎将JSP页面翻译成Servlet源文件时也可能导致中文乱码问题

    JSP引擎将JSP源文件翻译成的Servlet源文件默认采用ISO8859-1编码,而JSP开发人员可以采用各种字符集编码来编写JSP源文件,因此,JSP引擎将JSP源文件翻译成Servlet源文件时,需要进行字符编码转换。

    如果JSP文件中没有说明它采用的字符集编码,JSP引擎将把它当作默认的ISO8859-1字符集编码处理。

    4、如何解决JSP引擎翻译JSP页面时的中文乱码问题

    通过page指令的contentType属性说明JSP源文件的字符集编码

    page指令的pageEncoding属性说明JSP源文件的字符集编码

    通知客户端编码方式为contentType

    三、 jsp 九个隐式对象 (笔试)

    1. 面试题:

    列举出jsp页面的九个隐式对象,并加以说明

    对象变量名,可直接在jsp中使用

    对象类型

    config

    ServletConfig

    application

    ServletContext

    response

    HttpServletResponse

    request

    HttpServletRequest

    session

    HttpSession

    out

    JspWriter

    page

    this(当前servlet对象)

    exception

    Throwable

    pageContext

    PageContext

    注意:

    exception对象不是每个页面都有 只有是错误页面(errorPage),并且 isErrorPage属性设置为true

    session 对象也不是每个页面都有 默认情况下有,但是如果将page指令的 session=”false”,则没有session内置对象

    2. out 对象

    JspWriter类型, 带缓冲的字符流 (包装流) BufferedWriter

    写入该流的数据最终会被刷新到 response , 调用response.getWriter().write(buffer) 方法

    什么情况下 JspWriter 会将数据刷新

    1) 缓冲区写满(默认大小为8kb, 可以在page指令中通过 buffer属性设置缓冲区大小)

    2) jsp 页面结束

    注意:

    1)jsp中输出数据尽量使用 out 不要使用response直接获得流输出

    原因在于, 写入 out 的数据会进缓冲区 再刷新到response, 如果两个都用,会导致后写的数据显示在前面

    2)jsp 页面结束时会自动调用 response.getWriter() 将数据刷新

    所以在jsp中不要调用 getOutputStream()

    当然也不方便做文件下载

    结论: 在jsp中用out输出数据

    3. pageContext对象

    主要功能,用于获得其他8大隐式对象

    这样做的意义:

    需要移除jsp中的java代码,就需要将java代码写到一个java类的成员方法中,然后想办法在jsp

    页面中调用该方法,以达到代码复用的目的

    由于在jsp中的java代码难免会访问8个隐式对象,因为这些对象都是和web开发相关的对象

    要移除这部分java代码就需要将8个对象传递给java类的方法,为了方便,我们通常的做法是只传递一个

    pageContext对象过去,这样在方法中就可以通过该对象很轻松地获得其他8个对象了

    pageContext 也是一个域对象,但只是在当前jsp页面有效

    重点:

    1) 默写9个对象, (具体描述9个对象怎么用)

    2) 理解pageContext对象的意义 (获得其他8个对象)

    pageContext 有个特殊的方法 findAttribute()

    四、 web开发中的四个域(重点)

    范围由小到大: page(jsp有效) request(一次请求) session(一次会话) application(当前web应用)

    page : PageContext对象

    request : HttpServletRequest对象

    session : HttpSession对象

    application : ServletContext对象

    class Request {
    
    private Map<String, Object> attributes = new HashMap();
    
    public void setAttribute(String name, Object value) {
    
    attributes.put(name,value);
    
        }
    
    public Object getAttribute(String name) {
    
    return attributes.get(name);
    
    }
    
    public void removeAttribute(String name) {
    
    attributes.remove(name);
    
        }
    
    }

     

    1. 这4个对象的生命周期?

    生命周期就是指对象的创建到销毁的期间

    page: jsp 页面被执行,生命周期开始,jsp 页面执行完毕 ,生命周期结束

    request : 用户发送一个请求,开始,服务器返回响应,请求结束,生命周期结束

    session : 用户打开浏览器访问,创建session(开始),session超时或被声明失效,该对象生命周期结束

    application: web应用加载的时候创建(开始), web应用被移除或服务器关闭,对象销毁(结束)

    2. 四个域的作用范围

    什么是域?为什么把这4个对象叫做域对象呢?

    域: 即范围的意思

    web中的域对象,可以存储对象,在作用范围内都可以取到

    内部是Map集合的实现 Map<String, Object>

    class PageContext {
    
        private Map attributes = new HashMap();
    
        private HttpSession session;
    
        
    
        public void setAttribute(String name, Object value) {
    
        attributes.put(name, value);
    
        }
    
        public Object getAttribute(String name) {
    
            attributes.get(name);
    
        }
    
        public void removeAttribute(String name) {
    
            attributes.remove(name);
    
            }
    
        } 
    
    }

    page: 只在当前jsp页面有效

    request: 只在当前请求有效, 每次请求分别对应不同的request域对象

    // session: 默认情况下,同一个浏览器来访问有效(发送同一个sessionid)

    session : 只在一次会话中有效,会话结束就无法取到数据了 (特殊情况,发送Cookie)

    application : 在一个web应用中有效 (只要服务器不关,web应用不移除就可以取数据)

    四个域对象的范围由小到大排列依次为: page request session application

    3. 哪种情况下用哪种域对象。

    原则: 四个域对象在选择的时候,能用范围小的绝不用范围大的

    page: 数据只是暂时存在集合,在jsp页面的其他地方要用,用page(页面中自定义的map)

    什么时候需要用map了,就用page

    request:数据只是做显示的,看完了就没用了,就存request域

    请求转发, Servlet 产生的处理结果(数据) 交给jsp显示,

    session: 数据给用户看完了,一会还要用,会话结束了就没用了

    用户登陆,用户信息发给客户端看,看完了,一会访问别的页面还要看用户信息

    购物车,购物成功了,给用户看购物车,待会随时可以查看购物车

    请求重定向,因为是两次请求,第一次请求的数据,第二次请求还要看

    application : 数据给一个用户用完了,别人还要用

    聊天室,聊天记录,需要给所有的用户看

    统计网站在线人数,所有人看到的应该是一个数

    总结: 需要定义Map不如用page,请求转发Servlet带给jsp的数据存request

    请求重定向带过去的数据存Session,全局的数据存application

    五、 jsp 细节

    只有当jsp页面指定的page指令isErrorPage为true时,才有exception隐式对象

    Session对象 不是每个jsp页面都能用的 前提是 page指令的session属性为true

    Jsp注释:

    1.sp 出错

    1) 被翻译的Servlet不能编译,语法错,这时会报告是因为jsp中的哪行导致不能编译

    2) 翻译的Servlet 在运行期间出现异常, 报告是jsp的哪行导致的异常

    此时会进一步报告导致异常的原因,在Servlet中的哪行出现异常

    2. jsp 映射 也是通过servlet 元素

    六、内省(neixing)

    1. javabean

    固定写法的java类

    1)必须有无参构造函数

    2)属性必须私有, 我们称为字段

    3)提供标准的getter和setter

    例: name 字段 的getter: String getName() settter: void setName(String name)

    2. 什么是内省

    内省: 通过反射的方式访问javabean

    Jdk中的api : PropertyDescriptor类操作Bean的属性

    3.BeanUtils工具包

    Apache组织开发了一套用于操作JavaBean的API(内省)

    核心类 BeanUtils

    setProperty(bean, name, value)

    copyProperties(target, source);

    可以支持String到8中基本数据类型转换

    其他引用数据类型都需要注册转换器 ConvertUtils.register(Converter, Class)

    3. WebUtils 工具类

    实现任何request提交的表单封装到对应的javabean

    重点:

    1. jsp运行原理(会被翻译成servlet)

    2. jsp脚本表达式和脚本片段

    3. jsp九大隐式对象

    4. web开发的四个域对象

    5. 内省

    beanUtils工具的使用

    使用

    七、 jsp标签(可选)

    为了移除jsp页面的java代码,sun公司提供了一些内置的标签

    我们称为jsp标签,或jsp动作元素

    1. <jsp:include> 相当于 RequestDispatcher 对象的页面引入

    dispatcher.include 实现 Servlet包含

    dispatcher.forward 实现servlet转发

    forward 在转发时 web容器会清空response中的数据

    在转发之后就无法向response写入数据

    动态引入方式,在程序运行期间引入,jsp被翻译成两个

    include指令也能实现页面的引入,静态引入,将两个jsp翻译成一个Servlet

    包含和被包含的jsp页面指令不能发生冲突

    其中,import和pageEncoding可以冲突

    2. <jsp:forward> 实现请求转发

    结合 <jsp:param> 标签传参,自动进行url编码,编码的方式参照request编码

    3. <jsp:useBean id class scope> 内省

    反射创建javabean,以id作为key存入指定的域

    其实在创建之前,会先去域中找,找到了则不创建

    4. <jsp:setProperty> 设置属性值

    <jsp:setProperty name=”user” property=”username” value=”zs” />

    <jsp:setProperty name=”user” property=”username” param=”username” />

    <jsp:setProperty name=”user” property=”*” /> 批量

    5. <jsp:getProperty> 获得属性值

    八、web开发模式

    Sun公司针对web开发提供了两种模式

    Model1: jsp+javabean 只适合小型应用

    Model2: servlet+jsp+javabean mvc

    -------------------------------------------------------------------------------

    Jsp的一些常用功能:

    1.您的ip是:<%=request.getRemoteAddr() %>

    2.滚动功能:<marquee behavior="scroll" direction="left"> </marquee>

    使用<div>的功能,ap元素。

    如果,这篇博客帮您解决了问题,不妨点击一下右下角的【推荐】。

    如果,您希望更容易地发现我的新博客,不妨点击一下【加关注】。

    因为,我的热情需要您的肯定和支持! 

    感谢您的阅读,如果文章中有错误或者您有什么好的建议,也欢迎您直接留言批评指教。Thanks,friends!




  • 相关阅读:
    gj10 python socket编程
    自定义Git
    使用GitHub
    标签管理之操作标签
    标签管理之创建标签
    标签管理
    git分支管理之多人协作
    git分支管理之Feature分支
    git分支管理之Bug分支
    git分支管理之分支管理策略
  • 原文地址:https://www.cnblogs.com/yejiurui/p/2712457.html
Copyright © 2020-2023  润新知