Jsp学习笔记以及相关总结积累

一、使用application 内置对象读web.xml 中的参数:

Web.xml 中如下:

<context-param>
       <param-name>driver</param-name>
       <param-value>com.jdbc.mysql.Driver</param-value>
    </context-param>
    <context-param>
       <param-name>uri</param-name>
       <param-value>jdbc:mysql://localhost:3306/shopping</param-value>
    </context-param>
   
    <context-param>
       <param-name>user</param-name>
       <param-value>root</param-value>
    </context-param>
 
    <context-param>
       <param-name>pwd</param-name>
       <param-value>root</param-value>
</context-param>


上面就是在 web.xml 中配置将要读取的的全局参数! 下面使用 application 进行读取并显示到页面上:

 Servlet中的代码:

   

        String driver =getServletContext().getInitParameter("driver");
              Stringuri=getServletContext().getInitParameter("uri");
              Stringuser=getServletContext().getInitParameter("user");
              Stringpwd=getServletContext().getInitParameter("pwd");

   通过上面的连个步骤就可以读取全局变量!

 

二、使用 config 对象,读取servlet 的参数:

不管是Jsp页面还是servlet, config内置对象代表翻译之后的的 .java 本身!这种方法读取参数的使用场合:字符过滤器:

 

Serlet 中的配置如下:

<servlet>
       <servlet-name>config</servlet-name>
       <servlet-class>config</servlet-class>
       <init-param>
           <param-name>charset</param-name>
       <param-value>utf-8</param-value>
   </init-param>
 </servlet>


在serlvet 中的代码如下:

      

Stringcharset=this.getServletConfig().getInitParameter("charset");

 

三、exception 对象:

       exception 对象是 Throwable 类的实例,在Jsp中处理异常的模式,两个页面组成了一个try…….catch….

 

四、pageContext 对象:

pageContext.setAttribute("request","hello",pageContext.REQUEST_SCOPE);

五、request 对象:

       使用 request.getParameterMap() 可以获取请求的Map 集合对象;使用request应注意以下情况:

        并不是每个表单域都可以生成请求参数的,只有有name属性的表单域才可以生成请求参数的!如果多个表单域的name值相同,则生成一个请求参数;表单域的name属性为请求参数的名,value属性值为请求的值;如果某个表单的disabled=”true”则该表单不在生成请求参数!

      

              Map<String,Object>res=request.getParameterMap();
              Iterator<?>iter=res.keySet().iterator();
              while(iter.hasNext()) {
                     Stringstr=iter.next().toString();
                     System.out.println(str);
              }

       使用如上代码获取请求信息的Map<String,String> 对象!为什么我们在jsp中设置的请求参数,不管是在 jsp中还是在 servlet中都可以获得到;原因就在于;系统将我们的请求参数放入了一个Map,不管是在jsp中还是在 servlet  总我们都是访问的这个map对象;

       

              Stringqstr=request.getQueryString();
              System.out.println(qstr);
              StringstrE=java.net.URLDecoder.decode(qstr,"utf-8");
              System.out.println(strE);
              String[] arrayStr=strE.split("&");
              for(String string : arrayStr) {
                     System.out.println("每个请求参数的值,对"+string);
                     String[] subStr=string.split("=");
                     System.out.println("名称:"+subStr[0]);
                     System.out.println("值"+subStr[1]);
              }

       Request 对象的getQuaryString() 方法,可以获取请求字符串,java.net.Decoder.decode() 用于解码(原因是在请求参数中含有非西欧字符的参数,所以要使用java.net.Decoder.decode()进行解码);

       使用getRequestDispatcher(“{0}”).forward()跳转时,要在 0 处的项目资源加 ‘/’;

      

 

 

六、response 对象:

比较request.getRequestDispatcher().forward(request,response)response.sendRedirect():

Forward 执行完之后还是上一次的请求,而redirect  后生成第二次请求;forward 请求后,目标页面可以访问请求的请求参数,因为是同一个request请求,即所有的请求参数在同一个 request对象中都存在,而使用 redirect 后目标页面不能使用原来的请求参数,因为已经是第二次请求了,那也就是说,request对象的消失,请求的参数就会跟着消失;还有使用 forward 请求url 中的地址不会改变. 而使用 redirect 会改变为目标的 url;

 

七、cookie 的读写:

写入 cookie 对象:

//设置临时Cookie
           Cookie tempCookie=newCookie("temp","222222");
           tempCookie.setMaxAge(-1);   //默认值,不会把 Cookie 保存到硬盘上
           response.addCookie(tempCookie);
 
           //设置 MaxAge 为 0 的 Cookie
           Cookie cookie=newCookie("cookie","111111");
           cookie.setMaxAge(0);  //表示浏览器接受 Cookie  后会被立即删除
           response.addCookie(cookie);
 
           //设置永久的 Cookie
           Cookie mcookie=newCookie("name","000000");
           mcookie.setMaxAge(60*60*24);
           response.addCookie(mcookie);


       读取 cookie 对象:

           

  protected Cookie getCookie(Cookie []cookies,String name){
                   if(cookies!=null){
                            for(Cookie c : cookies) {
                                     if(c.getName().equals(name)){
                                               returnc;
                                     }
                            }
                     }
                   returnnull;
             }
 
             PrintWriter out = response.getWriter();
                  
                   //获得临时的  Cookie
                   Cookie temp=getCookie(request.getCookies(),"temp");
                   if(temp!=null){
                            out.print("临时Cookie的值为:"+temp.getValue());
                   }else{
                            out.print("没有值!");
                   }
 
                   //获取时间为 0 的Cookie,这个 Cookie永远都不可能获得到
                   Cookiecookie=getCookie(request.getCookies(), "cookie");
                   if(cookie!=null) {
                            out.print("MaxAge为零的Cookie:"+cookie.getValue());
                   }else {
                            out.print("没有值!");
                   }
 
                   //获取永久的Cookie
                   Cookiename=getCookie(request.getCookies(), "name");
                   if(name!=null) {
                            out.print("永久Cookie 值:"+name.getValue());
                   }else {
                            out.print("没有值!");
                   }
 

 

cookie中写的时候对汉字的处理:

添加之前将字符串使用java.net.URLEncoder.encode("高江涛","utf-8"); 取出来之后将结果java.net.URLDecoder.decode(temp.getValue(),"utf-8");

 

 

八、servlet中访问servlet的配置参数:

ServletConfigconfig=this.getServletConfig();
        config.getInitParameter("paramName");


九、自定义标签:

 

a)        传统的Jsp脚本有什么坏处:

                       i.             Jsp 脚本非常丑陋,难以阅读!

                     ii.             Jsp 脚本和 HTML 代码混杂,维护成本高!

                   iii.             HTML 页面中嵌入 Jsp 脚本,导致美工难以参加开发!

 

b)       自定义标签的开发步骤:

                       i.             建立自定义标签的处理类;

                     ii.             建立一个 *.tld 文件,每一 tld文件都对应一个标签库,每个标签库对应多个个标签!

                   iii.             在Jsp 页面上使用自己的标签!

 

c)        .tld 文件的描述(根元素为 tag-lib):

                       i.             tlib-version: 标签库的版本,这个对程序的作用不大!

                     ii.             short-name: 标签库默认的短名,通常对程序的作用也不大!

                   iii.             uri: 该标签库的uri,指定该标签库的唯一标示;

                    iv.             tag: tag-lib 下可以有多个 tag,每个 tag 都代表一个标签;

 

d)       tag 下的元素描述:

name: 这个非常重要,jsp页面就是根据这个来使用这个标签的;

tag-class: 这个是这个标签的后台处理类!

body-content: 这个属性可以是一下值: tagdependent: 指定标签的处理类,自己负责处理标签体! Empty: 空体标签; scriptless: 该标签里面可以含有静态的 HTML , 表达式语言,但不可以是 JSP 脚本! JSP :这个已被忽视;

 

e)        带属性自定义的标签开发:

对于有属性的标签,要为tag添加 attribute 子元素: 每个 attribute 子元素定义一个属性,attribute含有一下子元素:

       Name: 属性的名称;

       Required: 设置该属性为必须属性;

       Fragment: 是否支持Jsp脚本等动态内容!

 

f)        在页面上使用自己定义的标签:

<%@ taglib uri="http://xabc.net"prefix="mytag" %>

 

g)       带体的标签:

Collection<?>itemList=
(Collection<?>)getJspContext().getAttribute(this.getCollection());
        for (Object object : itemList) {
           getJspContext().setAttribute(this.getItem(),object);
           getJspBody().invoke(null);
}


十、过滤器:

a)        过滤器的使用场合:

                       i.             权限过滤;

                     ii.             日志过滤;

                   iii.             非法IP过滤;

                    iv.             字符集过滤;

 

b)       创建过滤器的后台处理类,实现Filter接口,实现如下方法:

                       i.             init(FilterConfig config); 用于对过滤器的初始化;

                     ii.             defiler(ServletRequestrequest,SerletResponse response,FilterChain chain);用于将请求继续传递;

                   iii.             destroy(): 用于在 Filter 销毁之前将某些资源回收!

 

 

c)        在 web.xml 下如下配置:

<filter>
       <filter-name>filter</filter-name>
       <filter-class>util.DoFilter</filter-class>
       <init-param>
           <param-name>endoding</param-name>
           <param-value>utf-8</param-value>
       </init-param>    
       <init-param>
           <param-name>fristPage</param-name>
           <param-value>index.jsp</param-value>
       </init-param>
       <init-param>
           <param-name>IP</param-name>
           <param-value>127.0.0.2</param-value>
       </init-param>
    </filter>
    <filter-mapping>
       <filter-name>filter</filter-name>
       <url-pattern>/*</url-pattern>
</filter-mapping>


 

* 过滤器主要是对用户的请求进行预处理,也可以对 HttpServletResponse进行后处理!

 

过滤器的核心代码:

public void doFilter(ServletRequest request,ServletResponse response,
              FilterChainchain) throws IOException, ServletException {
              request.setCharacterEncoding(this.encoding);
              HttpServletRequesthrequest=(HttpServletRequest)request;
              HttpServletResponsehresponse=(HttpServletResponse)response;
              Stringspath=hrequest.getServletPath();//获取请求的路径
              Stringip=hrequest.getLocalAddr();//获取请求的IP
              if(!ip.equals(this.IP)) {
                     if(!spath.endsWith(this.firstpage)) {
request.getRequestDispatcher(this.firstpage).forward(hrequest,hresponse);
                     }else{
                            chain.doFilter(hrequest,hresponse);
                     }
              }else{
                     hrequest.setAttribute("msg","<scriptlanguage=‘javascript‘>window.alert(‘您被限制了!‘) </script>");
                     hrequest.getRequestDispatcher("error.jsp").forward(hrequest,hresponse);
              }
       }


 

 

十一、       监听器:

a)        使用 Listener 的步骤:

                       i.             创建 Listener 实现类,实现 ServeltContextListener 接口;包含一下方法:

1.         contextInitialized (ServletContextEvent sce): 启动web应用时,系统调用的方法;

2.        contextDestroyed(ServletContextEvent sce): 关闭 web 应用时,系统调用的方法;

                     ii.             在web.xml 中配置如下:

<listener>

      <listener-class>util.Listener</listener-class>

</listener>

      监听器如 servlet 的 load-on-startup一样,但是比servlet 的 load-on-startup 执行的还早,还有监听器不负责处理及相应用户的请求; 还有监听器在web.xml 下配置的时候无需配置参数,所访问的参数为全局共有参数。

 

十二、       配置 JSP属性:(在 JSP 2.1 之后的支持!)

<jsp-property-group>元素配置,主要包含以下子元素:

<el-ignored>:决定页面是否使用EL表达式,也就是是说是否解析EL表达式;默认为 false,可以使用 EL 表达式;

<sription-invalid>:默认为false,允许JSP页面可以使用 JSP脚本!

<page-encoding>:声明JSP页面的编码格式,指定次属性后,就不用在每个页面上使用pageEncoding: 来指定此页面的字符集;

<include-prelude> 和 <include-coda> :来指定页面的头部和尾部!

<jsp-config>
               <jsp-property-group>
                  <url-pattern>/admin/*</url-pattern>
                      <el-ignored>true</el-ignored>
                      <page-encoding>utf-8</page-encoding>
                      <scripting-invalid>true</scripting-invalid>
               </jsp-property-group>
 </jsp-config>


 

十三、       JSP中表达式语言(Expressionlanguage):

a)        ${1+2} : 前加 ‘ \’ 表示此EL 表达式不被解析;

b)       表达式语言的内置对象:

                       i.             pageContext: 代表页面的 pageContext 对象,与JSP中的PageContext相同;

                     ii.             pageScope: 获取page 范围内的属性;

                   iii.             requestScope: 获取 request 范围内的属性;

                    iv.             sessionScope : 获取 session 范围内的属性;

                      v.             applicationScope : 获取 application 范围内的属性;

                    vi.             param : 用于获取请求参数;

                  vii.             paramValues: 用于获取请求的参数,与param不同的是该对象是用于获取返回值为数组的参数;

                viii.             header: 用于获取请求头信息;

                    ix.             headerValues : 用于获取请求头信息; 与header不同的是该对象是用于获取返回值为数组的请求参数;

                      x.             initParam: 用于获取有 web 应用初始化的参数;

                    xi.             cookie: 用于获取指定 cookie 的值;

 

 

c)        EL的自定义函数:

                       i.             自定义表达式语言与自定义标签类似;步骤分为:

1.        开发 EL函数处理类,这个类中的方法要求是静态的方法;

2.        建立tld 文件,tld 文件的描述:

name: 指定了函数的名称;

function-class: 函数对应的处理类;

function-signature:指定函数的实现方法;

3.        使用该函数;

<%@ tagliburi="http://xabc.com" prefix="fn"  %>
   ii.
 publicstatic String reverse(String str){
              returnnew StringBuffer(str).reverse().toString();
       }
       publicint  countChar(String text){
              returntext.length();
       }
    <function>
                        <name>reverse</name>
                        <function-class>demo.myfunction</function-class>
                        <function-signature>
                               java.lang.Stringreverse(java.lang.String)
                        </function-signature>
    </function>
    <function>
                 <name>countChar</name>
                 <function-class>demo.myfunction</function-class>
                 <function-signature>
                        intcountChar(java.lang.String)
                 </function-signature>
</function>


郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。