Java系列-JavaWeb

本文详细介绍了Servlet的工作原理,包括其生命周期、配置及与Tomcat的集成方式;同时还讲解了JSP的基础语法、内置对象及如何与EL表达式、JSTL标签配合使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、Servlet3.X 基于Annoation的编程
2、关于serlvet的url-path的/、/*、/xxxx的区别
        /xxxx只能匹配/xxxx
        /与/*可以匹配任意,但区别在于/可以拿到ServletPath、而/*拿不到*的匹配内容

--------------------------tomcat配置---------------------------------
在server.xml的<Connetor URIEncoding=“UTF-8”>可解决GET方式的乱码
1、映射虚拟目录
                   1、 在tomcat的confg下的server.xmlhost标签中加上<Context path='虚拟目录'   docBase="本地目录 />【此方法要重启服务器】[如果path=''就为缺省的web应用]
                   2、在conf/Catalina下添加相应的xml文件文件名为虚拟目录【如果文件名为ROOT.xml则为缺省的, 其中还是写一样的context代码
                   3、直接写在tomcat下的webapps下,服务器会自动把webapps下的所有目录映射
2、在本地配置一个自定义域名如[www.mokai .com]
1、配置hosts文件 打开系统盘下的Windows\System32\drivers\etc下的hosts文件,
      往里面加你的域名  如 127.0.0.1       www.mokai.com  【前面的ip为本地,也可以自定义其他ip】

2、建好相应的web应用目录
3、在tomcat的conf下的srver.xml里面加上
            <Host name="域名 "  appBase="主机目录" unpackWARs="true" autoDeploy="true">
   <Context path="" docBase="web应用目录"/>
   </Host>
3、通常开发好一个程序会把应用目录打包成一个.war的包,上传服务器

4、在context标签里面加上reloadable="true"时,应用被修改时会自动加载



--------------------------------------------------------------------------HTTP协议-----------------------------------------------------------------------

1、常用请求头:
Accept: text/html,image/*    
Accept-Charset: ISO-8859-1
Accept-Encoding: gzip,compress
Accept-Language: en-us,zh-cn 
Host: www.it315.org:80
If-Modified-Since: Tue, 11 Jul 2000 18:23:51 GMT
Referer: http://www.it315.org/index.jsp       从哪访问的
User-Agent: Mozilla/4.0 (compatible; MSIE 5.5; Windows NT 5.0)
Cookie
Connection: close/Keep-Alive   
Date: Tue, 11 Jul 2000 18:23:51 GMT

2、常用响应头:
Location: http://www.it315.org/index.jsp 
Server:apache tomcat
Content-Encoding: gzip 
Content-Length: 80 
Content-Language: zh-cn 
Content-Type: text/html; charset=GB2312 
Last-Modified: Tue, 11 Jul 2000 18:23:51 GMT
Refresh: 1;url=http://www.it315.org
Content-Disposition: attachment; filename=aaa.zip
Transfer-Encoding: chunked  
Set-Cookie:SS=Q0=5Lb_nQ; path=/search
Expires: -1
Cache-Control: no-cache  
Pragma: no-cache   
Connection: close/Keep-Alive   
Date: Tue, 11 Jul 2000 18:23:51 GMT

1、下载    res.setHeader("content-disposition", "attachment;filename="+URLEncoder.encode(fileName,"UTF-8"));
2、编码    res.setHeader("Content-type", "text/html;charset=UTF-8");
3、自动刷新  res.setHeader("refresh", "3");
                      res.setHeader("refresh", "3;url='/Demo3'");   //url为跳转的地址
4、 消除缓存
response.setHeader("pragma", "no-cache");
response.setHeader("cache-control", "no-cache");
                  
5、文件上传:enctype="multipart/form-data"  method="POST"

6、https协议使用端口是443,加密方式是SSL

7、json的header为    application/Json;charset=utf-8



------------------------------------------------servlet----------------------------------------------------------
1、Servlet是服务器小应用程序【引擎】,由Web服务器来调用的一个java类,用来完成B/S架构下,客户端请求的响应处理
     在Servlet中的相对路径都是相对相对当前应用的根目录来的
     Servlet内部采用的是iso8859-1编码
     javaweb的mvc    m[model  javabean v[view jsp]   c[cotroller servlet]
    


2、开发Servlet类一般继承HttpServlet类,另外Servlet中不适合输出

3、映射到URL中时可以使用   通配符,但只能有两种固定格式,
                            一种格式是    *.扩展名     如: *.html
                            另一种是     /*                如:/aa
    如果只为      /  则为缺省的Servlet

4、Servlet默认情况下,在客户端第一次请求时加载【加载init方法】,在servlet重新加载时【如重新部署】关闭【加载destroy方法】,
     在此期间,客户端的每次请求都导致service方法被调用,对于每访问请求,Servlet引擎都会创建
    一个新的ServletRequest 请求对象与ServletResponse回应对象,然后将这个两个对象作为参数传给他调用的service()方法,
    server方法再根据请求方式分别调用doXXX方法

5、如果在web.xml的servlet标签里面加入<load-on-startup>3</load-on-startup>【3为优先时间】Servlet对象则会在web服务器启动时就加载,可以避免应用发布后客户端第一次访问时会很久时间

6、Servletconfig   可以使用在web.xml中的servlet标签中加入<init-parm>标签为程序提供配置信息

7、ServletContext【context对象】【还有其他三个域:request session page】
     用途:1、做为整个WEB应用的参数 <Context-parm></Context-parm>
              2、多个Servelet对象共享数据
              3、实现Servlet的转发
              4、读取应用中的资源文件


8、response对象[响应信息]
     1、输出时编码问题:
              第一种:     res.setCharacterEncoding("utf-8");  //设置response使用的编码
               res.setHeader("Content-type", "text/html;charset=UTF-8");  //设置浏览器编码
                   或用封装好的方法
                               res.setContentType("text/html;charset=UTF-8");
              第二种:
                               输出流.write("<meta http-equiv='content-type' content='text/html; charset=UTF-8'>".getBytes());
    
      2、常见应用:验证码     自己新建一张BufferedImage然后写各种干扰和数字,用ImageIo写到IE中去
                          跳转url    <meta http-equiv='refresh' content='3;url=/index.jsp' >   用meta标签模拟http头
                
      3、请求重定向   浏览器会服务器发送两次,意味着就有2个request/response对象
                             用重定向技术,浏览器地址会发生变化
                res.setStatus(302);
res.setHeader("location", "/");
            or
                res.sendRedirect("/");
    
        4、转发    this.getServletContext().getRequestDispatcher("/Demo4").forward(req,res);      相当于调用另外一个Servlet,但浏览器地址不会变

      细节:getOutputStream()    getWriter()方法分别用于输出二进制文件与文本文件,并且二种方式互相排斥
               getOutputStream的流不需要自己关闭,Servlet容器在取response信息时会自动关闭
                且ServletOutputStream.println( )只支持ISO-8859-1

    

9、request对象[请求信息]
     1、常用方法
                     getParameter(name)  获得指定的get参数

     2、乱码问题:get方式【手动查码表】【通用】 new String(name.getBytes("iso8859-1"),"UTF-8");
                         post方式                    request.setCharacterEncoding("utf-8");

     3、请求转发的特点:
                                客户端只发一次请求,而服务器端有多个资源调用
                                客户端浏览地址栏没有变化
   
     4、转发   req.getRequestDispatcher("/DisplayServlet").forward(req,res);

     细节:在进行request转发[forward方法被调用]之前,不可向浏览器输出数据【可向respones里写,但流不可关】,也不可在之后再轩发【转发之后要return
              forward会清空respones中的数据


10、web中各类地址的写法
      1、如果是服务器操作则针对当前应用
      2、如果是浏览器操作则针对当前服务器

12、Cookie对象【存在于客户端浏览器】【如果想在其他页面也获得该cookie,必须设置setPath("")】
      1、cookie默认的生命周期与浏览器进程生命周期并行,如果希望自定义保存浏览器保存时间,可用setMaxAge()方法
      2、浏览器一般只允许存放300个cookie,每个站点最多放20个cookie,每个cookie的大小限制为4kb
      3、如果想删除指定cookie,则要:
                    cookie.setPath("/");//此cookie只针对当前页面有效
                    cookie.setMaxAge(0);
                    response.addCookie(cookie);//然后在回写给浏览器

13、session对象【存在于服务器中】【session对象是基于cookie的】
      1、一个session对象默认只为一个会话服务【除非设置了JSESSION的setMaxAge()】
      2、session工作原理:当客户端第一次在Servlet里调用getSession时,会创建一个Session对象,并会回写一个JRESSIONID的cookie,
            当客户端下次[同一次会话中]访问时JRESSIONID的cookie带过来,当在调用getSession时,Servlet引擎会判断
      3、解决seesion只为一个会话服务:可通过设置cookieJRESSIONID的缓存时间
                 HttpSession hs=req.getSession();//Session此时创建
//自定义session的cookie  ID缓存时间
String id=hs.getId();
Cookie c=new Cookie("JSESSIONID",id);
c.setMaxAge(30*60);
c.setPath("/");
res.addCookie(c);

      4、解决客户端浏览器Cookie禁用:可通过重写url相应的地址【url后面加上JRESSIONID的参数】来实现会话期间的数据保存
           如下代码:
                req.getSession();
String url1=res.encodeURL("/SessionDemo1");//如果浏览器的cookie被禁用,这方法会自动识别,自动创建cookie id
String url2=res.encodeURL("/SessionDemo2");
Out.println(res, "<a href='"+url1+"'>购买</a> ");
Out.println(res, "<a href='"+url2+"'>结账</a>");









------------------------------------------------jsp----------------------------------------------------------
1、jsp脚本片断语法   <% %>
    良好的jsp页面里不能出现一行script代码
    脚本表达式        <%=expression%>
    jsp脚本用客户端注释<!--      -->   不能注掉 
   

2、多个脚本片断之间可以相互访问
    

3、Jsp声明,<%!  public void run(){    }%>

4、jsp注释   <%---%>

5、jsp指令   <%@   %>
            Page   
                    session="true"|"false"        jsp创建时是否创建session
                    errorPage="/err/err.jsp"    jsp出错后自动转出错页面
                    iserrorPage="true | false"  页面是否为出错页面,如果是则会创建一个exception对象
            
            include【编译时包含】【常用】    包含的所有JSP翻译成一个servlet      不要出现重复的HTML全局架构标签
            response的include【运行时包含】【效率低】  包含的多个JSP翻译成个多个相应的servlet


6、jsp引擎自动导入了如下包
                java.lang.*;
                javax.servlet.*;
                javax.servlet.jsp.*;
                javaxservlet.http.*;

7、如果想自定义错误页面可以在web.xml里面使用error-Page来配置

8、九大隐式对象:
       1、 response 
                 2、exception
       3、 config
       4、 page
                 5、out 
                 6、 appliction 【整个应用程序】【最大的域】【ServletContext】       
       7、 session【整个会话期间】 
                 8、 request 【整个请求】
       9、 pageContext【整个页面】【包含其他隐式对象】【用在自定义标签开发技术里】【最小的域】
findAttribute(name)    整个域查找【查找顺序:page  session request apption】【e1表达式也是利用这个方法来查找的】

9、jsp标签

10、模板数据就是jsp的静态html与xml内容

11、动作脚本:
      1、jsp:useBean   
            <jsp:useBean id="user" class="bean.User" scope="session">
标签体执行<!-- 标签体只在user创建时才会执行 -->
    </jsp:useBean>  
            
            为bean属性赋值  <jsp:setProperty name="user" property="uname" value="龚凯" />
             如果想用请求参数为bean属性赋值,则param='属性名'
            【param与value不能同时存在】【如果想用所有请求参数赋值只要 property ='*'】【请求参数为bean属性赋值只能为基本类型
    
       


12、EL表达式【转换成Servlet后,实际调用的pageContext.findAttribute()方法,如果为null,则返回"" 】
            隐式对象:
pageContext
pageScope
requestScope
sessionScope
applicationScope
param【获得参数】
paramValues

Header
headerValues
CookieinitParam        
          运算符:  
EL算术运算符   +   -  *   /(div)   %(mod)
EL关系运算符   ==(eq)        !=(ne)      <(lt)       >(gt)        <=(le)      >=(ge)
逻辑运算符      &&(and)      ||(or)       !(not)
empty运算符    empty 
条件运算符
3元运算符
        1、访问一个javaBean的属性可通过 .[点]来获得,引用变量类型的属性可以一直点下去,
             访问一个javaBean的属性实际是通过getXXX()方法来获得的
        2、取数据时如果用点取不出来就用[]来取
        3、获得当前WEB应用的路径          ${pageContext.request.contextPath}
        4、操作参数:获取单个可通过param.参数名来获得参数值,如果为多个值时【如checkBox】,则用这个paramValues.参数名[n]
        5、操作集合:如果为List集合则可以通过序号的方式来获取第几个  如:${list[0]}
                            如果为Map集合则要el与JSTL一起用来达到遍历的效果      如:${map.a}   或${map['a']}
       6、${pageContext.request.contextPath} 可获得WEB应用名称

13、JSTL标签









14、Filter【过虑器】【单例的】
         工作原理:
         1、Filter链:多个Filter程序对一个Servlet程序拦截
         2、在doFilter方法中的调用FilterChain.doFilter()方法之前的代码 为前置代码,既 service 调用之前执行代码,FilterChain.doFilter()方法之后的代码,为后置代码,service之后执行的代码
        


15、自定义标签
    工作原理:
      1、传统标签【过时】【TagSupport类】【标签池缓存】
      2、简单标签 【SimpleTagSupport 类 】【不能包含JSP代码】
          得到body体内容用this.getJspBody,会得到一个JspFragment对象,然后通过对象.invoke()方法写进流里面【可以是getJspContext.getOut()   或自定义的流】
      3、开发带有属性的标签:1、标签处理类里有相应属性的setXXX()方法
                                        2、tld标签描述文件中映射好标签
                                           <attribute>
                                                <name>count</name>                  属性名字
                                                 <required>true</required>           是否为可选属性
                                                <rtexprvalue>true</rtexprvalue>   是否允许EL表达式
                                            </attribute>
                                        3、属性的类型可以是引用类型
     4、如果使用include引入页面中使用自定义标签,那么返回值不仅会影响引入页面后后面的代码,而且会影响引用页的代码
          但<jsp:include>不会影响引用页后面的代码
     5、如果想停止标签后面的代码执行,就throw new SkipPageException();
     6、在自定义标签里定义变量在tld文件里添加<variable></variable>
       
     
16、自定义函数
     1、方法必须是static 的























 
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值