Java Web 基础笔记(2)

三 JSP基础语法
 1.-----------------------------------------JSP注释-----------------------------------------------
    两种方式:显示注释和隐式注释
        显示注释是可以在客户端通过查看源文件的方式查看的,隐式注释是不能在客户端查看的,隐式注释的内容不会发往客户端
        显示注释:<!-- 注释内容-->
        隐式注释:1.//注释内容     2./* 注释内容 */  3.<%-- 注释内容 --%>
 2.----------------------------------------Scriptlet ---------------------------------------------
    脚本小程序,嵌入在HTML中的Java代码都需要以Scriptlet标记出来
    三种标记方式:1 <%  内容  %>  可以用于定义局部变量,编写语句等
                 2 <%! 内容  %>  可以用于定义类,全局变量,方法等
                 3 <%= 内容 %>   可以用于直接输出
    推荐使用<%= 内容 %>进行输出而不是用out.println()  使用<%= 内容 %>更有利于代码的分离,易于后期维护
    过多的使用<% %>  标签会导致代码的混乱,所以推出了<jsp:scriptlet> </jsp:scriptlet>  标签,效果与 <% %>相同
 3.---------------------------------------page指令------------------------------------------------
    常用的几个page指令:import 指定与要导入的操作包  例如:import="java.util.*"
                       contentType 指定jsp的编码格式和MIME类型  例如:contentType="text/html;charset=UTF-8"
                       pageEncoding 指定页面额编码方式
                       errorPage/isErrorPage  指定错误页面和指定本页面是否可以作为错误页面 组合使用
           pageEncoding和contentType设置编码格式的区别:
                     pageEncoding设置的是jsp页面的编码格式,contentType设置的是服务器发送给客户端的内容的编码格式 
    错误跳转页需要将isErrorPage设置为ture
       错误页
        <%@ page language="java" contentType="text/html" pageEncoding="GBK"%> 
        <%@ page errorPage="error.jsp"%>
        <html>
        <head><title></title></head>
        <body>
        <%
            int result = 10 / 0 ;
        %>
        </body>
        </html>

包含指令
        包含指令分为静态包含和动态包含:
            静态包含只是将包含的页面整合到现有页面中,然后进行编译输出
            动态包含会判断被包含页面是否为动态页面,如果为动态页面,则先进行动态的处理再进行合并
        静态包含:<%@ include file= "文件路径"%>   例如:<%@ include file= "info.jsp"%>
        动态包含:不传递参数<jsp:include page="{文件路径" | <%=表达式%>}"flush="true|false"/>
                 传递参数  <jsp:include page="{文件路径" | <%=表达式%>}"flush="true|false"/>
                            <jsp:param name = "参数名称" value="参数内容"/>
                            可传递多个参数.....
                          </jsp:include>
         flush表示是否使用缓存区,设置为false则文件完全读入后输出,设置为true则缓存区满就进行输出,一般设置为默认值true
         被包含页面可以使用request.getParameter()接受参数
        动态包含与静态包含的比较
            如当使用静态包含时,两个jsp代码中出现相同的变量名,会导致程序报错,而动态包含不会,因为动态包含是处理之后才进行合并的
    跳转指令
        不传递参数<jsp:forward page="{文件路径" | <%=表达式%>}"/>
        传递参数  <jsp:forward page="{文件路径" | <%=表达式%>}"/>
                    <jsp:param name = "参数名称" value="参数内容"/>
                    可传递多个参数.....
                    </jsp:forward>
                被跳转页面可以使用request.getParameter()接受参数

四 JSP内置对象
 1  ----------------------------------------------------------JSP内置对象概览-----------------------------------------------------------
    JSP分别提供了九个内置对象,分别是:
        pageContext         javax.servlet.jsp.PageContext               JSP的页面容器
        request             javax.servlet.http.HttpServletRequest       得到用户的请求信息
        response            javax.servlet.http.HttpServletResponse      服务器向客户端的回应信息
        session             javax.servlet.http.Httpsession              保存每一个用户的信息
        application         javax.servlet.ServletContext                表示所有用户的共享信息
        config              javax.servlet.ServletConfig                 服务器配置,可以取得初始化参数
        out                 javax.servlet.jsp.JspWriter                 页面输出
        page                java.lang.Object                            表示从页面中表示出来的一个Servlet实例
        exception           java.lang.Throwable                         表示JSP页面所发生的异常,在错误页中才起作用
        常用的五个JSP内置对象有: pageContext    request     response   session     application 
2 ------------------------------------------------------------四种属性范围-------------------------------------------------------------
    JSP提供四种属性的保存范围,就是指一个内置的对象,可以在多少个页面中保存并继续使用
    page: 只在一个页面中保存属性,跳转之后无效
    request: 只在一次请求中保存,服务器跳转之后依旧有效
    session: 再一次会话范围内,无论何种跳转都可以使用,但新开浏览器无法使用
    application: 在整个服务器上保存,所有用户都可以使用
    这四个内置对象都支持以下方法:
        public void setAttribute(String name,Object o)   设置一个属性的名称及内容
        public Object getAttribute(String name)          根据属性名取得属性值
        public void removeAttribute(String name)         删除指定的属性
    page属性范围:   
        javax.servlet.jsp.PageContext 中有一种设置属性的方法:
            public void setAttribute(String name,Object value,int scope)  设置属性并指定保存范围i
        scope是一个int常量,表示属性的保存范围
            public static final int PAGE_SCOPE = 1;             page范围
            public static final int REQUEST_SCOPE = 2;          request范围
            public static final int SESSION_SCOPE = 3;          session范围
            public static final int APPLICATION_SCOPE = 4;      application范围
3 ---------------------------------------------------------request对象---------------------------------------------------------------
    request对象是使用最多的一个对象,主要用于接收客户端发送来的请求信息,如请求的参数,发送的头信息等都属于客户端发来的信息
  request内置对象的常用方法
        public String getParameter(String name)       接收客户端发来的指定名称的请求参数内容
        public String[] getParameterValues(String name)   接受客户端发来的指定名称的一组请求参数内容
        public Enumeration getParameterNames()     取得全部请求参数的名称
        public String getRemoteAddr()     得到客户端的IP地址
        void setChracterEncoding(String env) throws UnsupportedEncodingException    设置统一的请求编码
        public boolean isUserInRole(String role)  进行用户身份的验证
        public Httpsession getSession()   取得当前的session对象
        public StringBuffer getRequestURL() 返回正在请求的路径
        public Enumeration getHeaderNames() 取得全部请求的头信息的名称
        public String getHeader(String name)   根据名称取得头信息的内容
        public String getMethod() 取得用户提交方式
        public String getServletPath()   取得访问的路径
        public String getContextPath() 取得上下文的资源路径
    URL地址重写
        动态页面地址?参数名称=参数内容1&参数名称2=参数内容2&...
        index.jsp?name=hsd&password=wt
        index.jsp使用request对象可以正常接受传递的值
    ----------------------------------取得请求参数相关---------------------------------------------
    public Enumeration getParameterNames()方法可以所有请求参数的名字,但返回值类型是Enumeration,需要使用hasMoreElements()方法判断是否有内容以及使用nextElement()方法取出内容
        Enumeration enu = request.getParameterNames();
        while(enu.hasMoreElements()){
            String str = (String)enu.nextElement();
        }
    ---------------------------------取得头信息-------------------------------------------------------
        Enumeration enu = request.getHeaderNames(); //取得名称
        while(enu.hasMoreElements()){
            String headerName = (String)enu.nextElement();
            String headerValues = request.getHeader(headerName);
        }
    -------------------------------其他操作-----------------------------------------------------------
        取得客户端的IP地址,访问的路径信息,提交方式等
        request.getMethod()   取得提交方式
        request.getRemoteAddr()     取得客户端的IP地址
        request.getServletPath()    取得访问路径
        request.getContextPath()   取得上下文资源名称
 4 ------------------------------------response对象---------------------------------------------------
    response对象主要用于对客户端的请求进行回应,常用方法:
        public void addCoohie(Cookie cookie)        向客户端增加Cookie
        public void setHeader(String name,String value)     设置回应头信息
        public void sendRedirect(String location) throws IOException  页面跳转
    --------------------------------设置头信息------------------------------------------------------------
        指定刷新时间的属性: refresh
        response.setHeader("refresh","2")  两秒一次刷新
        response.setHeader("refresh","2;URL=index.jsp")  两秒后跳转到index.jsp
        定时跳转属于客户端跳转,这种跳转方式可以在HTML中直接使用:
        <META HTTP-EQUIV="refresh"CONTENT="3;URL=index.jsp">
        也可以使用respnse.sendRedirect(URL)进行跳转,同样是客户端跳转,直接进行跳转
    客户端跳转和服务器端跳转的不同:request属性只能在服务器端跳转中保存,客户端跳转后失效
                                服务器端跳转时执行到跳转语句时立刻进行跳转,客户端跳转执行完整个页面后进行跳转
    -------------------------------操作Cookie-------------------------------------------------------------
    常用方法: 
            public Cookie(String name,String value)    构造方法,实例化对象并设置内容和名称
            public String getName()  获取Cookie名称
            public String getValue() 获取Cookie内容
            public void setMaxAge(int expiry)  设置Cookie的保存时间,以秒为单位 
    因为是服务端设置到客户端的,所以应该使用response对象的addCookie方法: public void addCookie(Cookie cookie)
    如果想要获取客户端设置的Cookie 使用request对象的getCookies方法
        public Cookie[] getCookies()  取得客户端设置的所有cookie,取到一个Cookie数组,进行遍历输出
        for(Cookie cookie:c){
            System.out.println(cookie.getName()+cookie.getValue();)
        }
    每一个客户端都会由服务器自动设置一个Cookie:JSESSIONID
    如果想在重启客户端后设置的cookie依旧有效,需要设置cookie的失效时间
    也可以通过设置头信息的方式设置cookie: response.setHeader("SET-Cookie","value");
 5 --------------------------------session对象---------------------------------------------------------
    session对象的主要使用时完成用户的登陆注销等。每一个session对象代表着一个不同的访问用户
    常用方法:
        public String getId()   获取SessionID 即JSESSIONID,每次session链接的时候都会分配一个id 重启服务器后会分配新的id
        public long getCreationTime() 获取session的创建时间
        public long getLastAccessedTime()  获取session的最后一次操作时间
        public boolean isNew() 判断是否是新的session,即判断是否是第一次访问
        public void invalidate() 让session失效
        public Enumeration getAttributeNames() 取得全部属性名称
    SessionID 可不可以重复使用: 可以,配置tomcat进行
    JSESSIONID 是在第一次访问时由服务器设置的,所以isNew方法可以通过session是否包含JSESSIONID判断是不是新用户
 6 ----------------------------application对象-----------------------------------------------------------------
    application对象是ServletContext接口的实例化对象,ServletContext常用方法
        String getRealPath()  得到虚拟目录对应的绝对路径
        public Enumeration getAttributeNames()  得到所有属性名称
        public String getAttribute(String name)  得到属性内容
        public String getContextPath() 取得当前的虚拟路径名称
    尽量使用this.getServletContext()代替application
    可以进行简单的文件操作,上传自定义的文本
 <%    
    request.setCharacterEncoding("GBK") ;    // 解决乱码问题
    String name = request.getParameter("filename") ;
    String content = request.getParameter("filecontent") ;
    // 要想操作文件必须有绝对路径,那么这个时候getRealPath()
    String fileName = this.getServletContext().getRealPath("/") + "note" + File.separator + name ;    // 保存在note文件夹之中
    File file = new File(fileName) ;    // 实例化File类对象
    if(!file.getParentFile().exists()){
        file.getParentFile().mkdir() ;    // 建立一个文件夹
    }
    PrintStream ps = null ;
    ps = new PrintStream(new FileOutputStream(file)) ;
    ps.println(content) ;
    ps.close() ;
%>
<%//读取
    Scanner scan = new Scanner(new FileInputStream(file)) ;
    scan.useDelimiter("\n") ;
    StringBuffer buf = new StringBuffer() ;
    while(scan.hasNext()){
        buf.append(scan.next()).append("<br>") ;
    }
    scan.close() ;
%>
<%=buf%>
 7 ----------------------------------------web安全性及config对象---------------------------------------------------
    Web目录中WEB-INF目录是最安全的,无法被外部访问,所以将一些配置文件保存在这里,但web-inf目录安全等级太高,所以正常的文件也无法访问,
    需要修改web.xml进行映射:
        <servlet>
            <servlet-name> hello< /servlet-name>
            <jsp-file> /WEB-INF/hello.jsp </jsp-file>
        </servlet>
         <servlet-mapping>
            <servlet-name> hello< /servlet-name>
            <url-pattern>/hello.wt </url-pattern>
         </servlet-mapping>
    即将hello.jsp设置为一个名为hello.wt的映射,在地址栏输入hello.wt就可以访问这个页面
    config对象用来取得一些初始化的配置信息,常用方法:
        public String getInitParameter(String name)    取得指定名称的初始化参数内容
        public Enumeration getInitParameterNames()     取得全部的初始化参数名称
 8 ----------------------------------out对象-----------------------------------------------------------------------
    常用方法:
        public int getBufferSize()   取得jsp中缓存区的大小
        public int getRemaining()    取得jsp中未使用的缓存区大小
 9 ----------------------------------pagecontext对象----------------------------------------------------------------
    常用方法:
        public abstract void forward(String relativeUrlPath) throws ---   页面跳转
        public abstract void include(String relativeUrlPath) throws ---   页面包含
        public ServletConfig getServletConfig()        -------|
        public ServletContext getServletContext()      -------| 
        public ServletRequest getRequest()             -------|-------取得相关对象
        public ServletResponse getResponse()           -------|
        public HttpSession getSession()                -------|

猜你喜欢

转载自blog.csdn.net/qq_39156722/article/details/93404879