xml&Tomcat&Servlet笔记

XML元素创建规则:
元数据(关于数据的数据)应当存储为属性,而数据本身应当存储为元素。

为什么使用 DTD?
通过 DTD,您的每一个 XML 文件均可携带一个有关其自身格式的描述。
通过 DTD,独立的团体可一致地使用某个标准的 DTD 来交换数据。
而您的应用程序也可使用某个标准的 DTD 来验证从外部接收到的数据。
您还可以使用 DTD 来验证您自身的数据是否正确。

XML 文档构建模块
所有的 XML 文档(以及 HTML 文档)均由以下简单的构建模块构成:

  • 元素
  • 属性
  • 实体
  • PCDATA
  • CDATA

    CDATA: Character Data, PCDATA: Parsed CDATA,是可以分析的字符序列,两者有什么区别呢?
    CDATA是指CDATA就是指字符串,而PCDATA可以是字符串、子元素、字符串和子元素
    CDATA用于说明属性,PCDATA用于说明元素

java 中由Writer类继承下来的子类没有提供编码格式处理,所以dom4j也就无法对输出的文件进行正确的格式处理。这时候所保存的文件会以系统的默认编码对文件进行保存,在中文版的window下java的默认的编码为GBK,也就是所虽然我们标识了要将xml保存为utf-8格式但实际上文件是以GBK 格式来保存的,所以这也就是为什么能够我们使用GBK、GB2312编码来生成xml文件能正确的被解析,而以UTF-8格式生成的文件不能被xml解析器所解析的原因。所以不应该用FileWriter对象来构建xml文档,而应该使用FileOutputStream对象来构建。
FileOutputStream outStream = new FileOutputStream(fileName);
//Writer fileWriter = new FileWriter(fileName);
OutputFormat format = OutputFormat.createPrettyPrint();
//上边这个也可以new
format.setEncoding(“UTF-8”);
XMLWriter xmlWriter = new XMLWriter(outStream,format);
xmlWriter.write(document);
xmlWriter.close();
这样使用FileOutputStream对象构建出来的xml中文就不是乱码
这里写图片描述
这里写图片描述
这里写图片描述

<?xml version="1.0" encoding="utf-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
   version="2.5"> 

   <servlet>
      <servlet-name>dog</servlet-name>
      <servlet-class>MyServlet</servlet-class>
      <init-param>
    <param-name>encoding</param-name>
    <param-value>utf-8</param-value>
      </init-param>
      <init-param>
    <param-name>corpname</param-name>
    <param-value>哈喽dog</param-value>
      </init-param> 
      <load-on-startup>0</load-on-startup>//加载优先级
   </servlet>

      <servlet>
      <servlet-name>pig</servlet-name>
      <servlet-class>MyServlet</servlet-class>
      <init-param>
    <param-name>encoding</param-name>
    <param-value>utf-8</param-value>
      </init-param>
      <init-param>
    <param-name>corpname</param-name>
    <param-value>哈喽pig</param-value>
      </init-param> 
      <load-on-startup>3</load-on-startup>
  </servlet>

   <servlet-mapping>
    <servlet-name>dog</servlet-name>
    <url-pattern>/xxx/yyy.html</url-pattern>
   </servlet-mapping>

   <servlet-mapping>
    <servlet-name>pig</servlet-name>
    <url-pattern>/xxx/yyy/zzz.html</url-pattern>
   </servlet-mapping>

</web-app>
Servlet对象在第一次访问时创建
写几个<servlet>就有几个Servlet对象,一般一个页面请求对应一个servlet对象

eclipse中修改类文件使tomcat自动重新加载需要修改tomcat的配置文件
/conf/context.xml
<Context reloadable="true"/>
可以在tomcat的文档中查阅 

get与post:
post方式信息全部以流的形式传输,get只将信息存储在http的请求header中,都可以用req.getParameter("title")这种方式取值,注意这种方法获得的值都是String类型的,如果是数字需要进行转化!!
而post还可以用流的方式取到传输的信息,流文件太大时,可以在读取流时可以写一个流的拷贝函数,每次读取一定字节数,循环读取.
jsp是以Servlet为基础,jsp页面中<% %>中的代码相当于在Servlet中的service执行.其他html代码都会被转换成out.println()输出
<%= %>相当于<% out.println()%>
注意写标签一定要闭合!!!

java IDE 中可以设置Context root 就是项目发布到Tomcat的文件夹名字,可以与java下项目名字不同

Cookie创建读取时注意路径
子路径可以读取父路径的cookie,父路径不可以读取子路径的cookie
Servlet输出流应该先设置编码再获取输出流;

Cookie编码问题
表单提交的内容(比如用户名)在转换成Cookie时,不支持中文,可以用URLEncoder进行编码存储,使用时用URLDecoder进行解码
username = URLEncoder.encode(username, “utf-8”);
username = URLDecoder.decode(username, “utf-8”);
注意表单在提交内容时,如果有中文,只能(最好)用POST方式并编码提交!
如果我们不去改变tomcat的默认编码,可以使用 new String(request.getParameter(“username”).getBytes(“iso-8859
-1”), “utf-8”);手工重新解码. **request.setCharacterEncoding(“utf-8″)这种方式对于get方式提交数据是无效的!!!但是对post方式提交数据却是有效的.因为get没有request body.**get头默认编码方式iso-8859-1.这个属性可以在tomcat的server.xml中的Connector中中添加URLEncoding=”utf-8”
jsp页面乱码问题:
可以在jsp页面前面加上:

<%
request.setCharacterEncoding(“utf-8″)
%>

这里写图片描述
这里写图片描述
这里写图片描述
Session是通过Cookie传递的,session创建后会存在Cookie中响应回去:
JSESSIONID=….. 客户端再次请求的Cookie中就包含它;
这里写图片描述
session能存储一些对象对象对应的JSESSIONID,因此能间接地存储更多东西;如果Cookie被浏览器禁用,就需要用URL重写将JSESSIONID=…存储在URL中
session代表一次会话,不同浏览器登陆的session互不影响,如果调用ServletContext中的参数则共用这里写图片描述这里写图片描述
这里写图片描述

也可以用: InputStream fis = this.getServletContext().getResourseAsStream("/WEB-INF/db.properties");
改变Servlet的属性:
<load-on-startup>0</load-on-startup>能使Tomcat启动时先加载此类,并调用Servlet中的init()方法,在浏览器访问时会才会调用doGet()等方法

这里写图片描述
路径问题:
./或/代表当前路径
../代表当前路径的上一级路径
../..//代表上一级的上一级路径

转发和重定向区别:

转发:
 request.getRequestDispatcher"/book/RemovebookServlet".forward(request,response);
 重定向:
 response.sendRedirect"./RemovebookServlet";//注意路径

重定向
1.地址路径变化
转发:地址路径不变化,在服务器进行,不发送新的请求
重定向:地址路径变化,在客户端进行,发送新的请求
2.request中存储的信息是否丢失
转发:不发送新的请求,request的信息没有丢失
重定向:发送新的请求,request的信息丢失
3./的使用不一样
转发:/表示从web应用的相对路径开始查找
重定向:/表示从web站点的路径开始查找(Tomcat服务器的webApp目录),因此可能出现……/webApp/book/RemovebookServlet中间少项目名称,因此会404
4.访问的资源
转发:只能访问当前web应用的资源,不能访问外部资源
重定向:上面两种资源都能访问,外部资源(如:www.sohu.com);
5.是否可以访问WEB-INF下的资源
转发:可以访问
重定向:不可以
6.访问的次数
转发:1次
重定向:2次
jsp中的异常处理:
方法一:
*在出现异常的jsp页面增加以下代码:
errorPage:当该jsp页面出现异常时,转发到由errorPage所指向的页面进行异常的处理

<%@ page errorPage="/exception/error.jsp"%>

*处理异常:

<%@ page isErrorPage="true" %>
    isErrorPage属性表示页面是否可以使用jsp的内置对象exception
    true表示在该页面可以使用
...........<%= exception.getMessage%>.........

方法二:
*在出现异常的jsp页面,不用增加任何代码
*在web.xml文件中增加如下的配置

```
<error-page>
    jsp页面产生的异常类型:
    <exception-type>java.lang.Exception</exception-type>
    出现此类异常后转向的页面:
    <location>/WEB-INF/error.jsp</location>
</error-page>
```

方法三:
比方法二更优先:

<error-page>
jsp页面产生的异常代码404:
<error-code>404</error-code>
出现此类异常后转向的页面:
<location>/WEB-INF/error.jsp</location>
</error-page>

jsp页面session内置对象 page session=“false”该对象被禁用,可以通过HttpSession se = request.getSession()得到,它们指向同一对象.
访问各个域范围中的属性:
在application、session、request、page对象中都可以调用setAttribute方法和getAttribute方法来设置和检索各自域范围内的属性。
存储在application对象中的属性可以被同一个WEB应用程序中的所有Servlet和JSP页面访问。
存储在session对象中的属性可以被属于同一个会话的所有Servlet和JSP页面访问。
存储在request对象中的属性可以被属于同一个请求的所有Servlet和JSP页面访问,例如使用PageContext.forward和PageContext.include方法连接起来的多个Servlet和JSP页面。
存储在pageContext对象中的属性仅可以被当前JSP页面的当前响应过程中调用的各个组件访问,例如,正在响应当前请求的JSP页面和它调用的各个自定义标签类。
PageContext类中还提供了对各个域范围的属性进行统一管理的方法,以简化对各个域范围内的属性的访问。
out隐式对象:
在JSP页面中应使用out隐式对象来向客户端发送文本形式的实体内容。
out对象是通过调用pageContext对象的getOut方法返回的,其作用和用法与ServletResponse.getWriter方法返回的PrintWriter对象非常相似。
JSP页面中的out隐式对象的类型为JspWriter,JspWriter相当于一种带缓存功能的PrintWriter,设置JSP页面的page指令的buffer属性可以调整它的缓存大小,甚至关闭它的缓存。
JSP页面中的out隐式对象相当于插入到ServletResponse.getWriter方法返回的PrintWriter对象前面的缓冲包装类对象。
只有向out对象中写入了内容,且满足如下任何一个条件时,out对象才去调用ServletResponse.getWriter方法,并通过该方法返回的PrintWriter对象将out对象的缓冲区中的内容真正写入到Servlet引擎提供的缓冲区中:
设置page指令的buffer属性关闭了out对象的缓存功能
写入到out对象中的内容充满了out对象的缓冲区
整个JSP页面结束
pageContext对象
pageContext.getException方法返回exception隐式对象
pageContext.getPage方法返回page隐式对象
getRequest方法返回request隐式对象
getResponse方法返回response隐式对象
getServletConfig方法返回config隐式对象
getServletContext方法返回application隐式对象
getSession方法返回session隐式对象
getOut方法返回out隐式对象
通过以上方法获取jsp页面各个隐式对象。

pageContext对象

这个对象代表页面上下文,该对象主要用于访问JSP之间的共享数据。

pageContext是PageContext类的实例,使用pageContext可以访问page、request、session、application范围的变量。
getAttribute(String name):取得page范围内的name属性。
getAttribute(String name,int scope):取得指定范围内的name属性,其中scope可以是如下4个值:
PageContext.PAGE_SCOPE:对应于page范围。
PageContext.REQUEST_SCOPE:对应于request范围。
PageContext.SESSION_SCOPE:对应于session范围。
自定义JSP标签:
这里写图片描述

//最大值标签流程
1.首先建立标签实现类
public class MaxValueTag implements SimpleTag {

    private Integer num1;

    private Integer num2;

    private PageContext pageContext;

    public void setNum1(Integer num1) {
        this.num1 = num1;
    }

    public void setNum2(Integer num2) {
        this.num2 = num2;
    }

    @Override
    public void doTag() throws JspException, IOException {
        // TODO Auto-generated method stub
        if(num1 > num2){
            pageContext.getOut().println(num1);
        }else{
            pageContext.getOut().println(num2);
        }
    }
    //......省略代码
}
2.配置tld文件
<?xml version="1.0" encoding="UTF-8" ?>

<taglib xmlns="http://java.sun.com/xml/ns/j2ee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
    version="2.0">

  <description>mytag 1.1 core library</description>
  <display-name>mytag core</display-name>
  <tlib-version>1.1</tlib-version>
  <short-name>hui</short-name>
  <uri>http://java.sun.com/jsp/jstl/hui</uri>

  <tag>
    <name>Date</name>
    <tag-class>com.hui.tag.DateTag</tag-class>
    <body-content>empty</body-content>
  </tag>
  <tag>
    <name>MaxValue</name>
    <tag-class>com.hui.tag.MaxValueTag</tag-class>
    <body-content>empty</body-content>
    <!--配置属性num1 -->
    <attribute>
       //该名称必须和标签处理类setNum1方法一致(JavaBean对象)
        <name>num1</name>
        <required>true</required>
        <rtexprvalue>true</rtexprvalue>
<!-- 配置属性是否支持el表达式传的值 run time expression value -->
    </attribute>
    <!--配置属性num2 -->
    <attribute>
        <name>num2</name>
        <required>true</required>
        <rtexprvalue>true</rtexprvalue>
    </attribute>
  </tag>
  </taglib>
3.web.xml中配置标签库(可省略)
<jsp-config>
    <taglib>
       <taglib-uri>/WEB/tag.tld</taglib-uri>
       <taglib-location>/WEB-INF/tld/tag.tld</taglib-location>
    </taglib>
  </jsp-config>
4.在jsp文件中引入标签库
  <%@ taglib uri="/WEB-INF/tld/tag.tld" prefix="h"%>
  前缀可以与标签库中的前缀设置不一样
  或者不用配置web.xml,直接引入标签库的uri
  <%@ taglib uri="http://java.sun.com/jsp/jstl/huihui" prefix="h"%> 在tld文件中的<uri>标签中
5.使用标签
<h:MaxValue num2="12" num1="13"/>
如果<rtexprvalue>为true,属性可以这样赋值,当时请求中一定要有num1=?的参数,可以写在url中测试
<h:MaxValue num2="${param.num1}" num1="13"/>

**foreach标签的实现**
<hui:List items="${pageScope.perlist}" var="pp">
      ^^^^${pp.name}  ____${pp.age} <br>
   </h:List>

public class ListTag implements SimpleTag {

    private PageContext pageContext;

    private String var;

    private List items;

    private JspFragment jspBody;

    public void setVar(String var) {
        this.var = var;
    }

    public void setItems(List items) {
        this.items = items;
    }

    @Override
    public void doTag() throws JspException, IOException {
        Iterator it = items.iterator();
        while(it.hasNext()){
            Object obj = it.next();
            pageContext.setAttribute(var, obj);
            //StringWriter sw = new StringWriter();
            //this.jspBody.invoke(sw);
            jspBody.invoke(null);
/*
**map遍历实现**
注意自已存储一个Map在pageScope中,直接让items=map(自已定义的Map实例对象)行不通,=两边必须都是属性值,用${}取得是属性值
   <h:Map items="${pageScope.map}" var="mm">
   *****^^^^${mm.key }<br>
   *****^^^^${mm.value.name }<br>
   *****^^^^${mm.value.age }<br>
   </h:Map>
public void doTag() throws JspException, IOException {
        // TODO Auto-generated method stub
        if(items != null){
            Set itemset = items.keySet();
            Iterator it = itemset.iterator();
            while(it.hasNext()){
                String key = (String)it.next();
                Object value =  items.get(key);

                MapKeyValue mkv = new MapKeyValue();
                mkv.setKey(key);
                mkv.setValue(value);

                pageContext.setAttribute(var, mkv);

                jspBody.invoke(null);
            }   
        }
    }

**遍历数组Array时可以使用Array.aslist(...)转化为List遍历;

public abstract void invoke(Java.io.Writer out)
用于执行JspFragment对象所代表的JSP代码片段,参数out用于指定将JspFragment对象的执行结果写入到哪个输出流对象中,如果传递给参数out的值为null,则将执行结果写入到JspContext.getOut()方法返回的输出流对象中。(简而言之,可以理解为写给浏览器)        
JspFragment.invoke方法可以说是JspFragment最重要的方法,利用这个方法可以控制是否执行和输出标签体的内容、是否迭代执行标签体的内容或对标签体的执行结果进行修改后再输出。
例如:
在标签处理器中如果没有调用JspFragment.invoke方法,其结果就相当于忽略标签体内容;
在标签处理器中重复调用JspFragment.invoke方法,则标签体内容将会被重复执行;
*/
        }

    }

这里写图片描述
这里写图片描述

//将标签内容转换为大写
    @Override
    public void doTag() throws JspException, IOException {
    StringWriter sw = new StringWriter();
    //把标签体的内容写入到sw这个流中,然后对内容进行操作
    this.jspBody.invoke(sw);
    //转化为大写输出pageContext.getOut().print(sw.toString().toUpperCase());
    }

这里写图片描述
这里写图片描述
然后在jsp页面引用即可

<%@ taglib uri="http://java.sun.com/jsp/jstl/huihui" prefix="h"%>
   ${h:getLength("asdcv")}<br>
   ${h:subString("abcdefg" , 1 , 3 ) }

JSP 标准标签库(JSTL)
JSP标准标签库(JSTL)是一个JSP标签集合,它封装了JSP应用的通用核心功能。
JSTL支持通用的、结构化的任务,比如迭代,条件判断,XML文档操作,国际化标签,SQL标签。 除了这些,它还提供了一个框架来使用集成JSTL的自定义标签。
根据JSTL标签所提供的功能,可以将其分为5个类别。
核心标签
格式化标签
SQL 标签
XML 标签
JSTL 函数

JSTL函数
JSTL包含一系列标准函数,大部分是通用的字符串处理函数。引用JSTL函数库的语法如下
<%@ taglib prefix=”fn”
uri=”http://java.sun.com/jsp/jstl/functions” %>
函数 描述
fn:contains() 测试输入的字符串是否包含指定的子串
fn:containsIgnoreCase() 测试输入的字符串是否包含指定的子串,大小写不敏感
fn:endsWith() 测试输入的字符串是否以指定的后缀结尾
fn:escapeXml() 跳过可以作为XML标记的字符
fn:indexOf() 返回指定字符串在输入字符串中出现的位置
fn:join() 将数组中的元素合成一个字符串然后输出
fn:length() 返回字符串长度
fn:replace() 将输入字符串中指定的位置替换为指定的字符串然后返回
fn:split() 将字符串用指定的分隔符分隔然后组成一个子字符串数组并返回
fn:startsWith() 测试输入字符串是否以指定的前缀开始
fn:substring() 返回字符串的子集
fn:substringAfter() 返回字符串在指定子串之后的子集
fn:substringBefore() 返回字符串在指定子串之前的子集
fn:toLowerCase() 将字符串中的字符转为小写
fn:toUpperCase() 将字符串中的字符转为大写
fn:trim() 移除首位的空白符

javabean中尽量用Interger代替int , int的默认值是0,而Integer的默认值是null

这里写图片描述

在servle中t配置,<load-on-startup>5</load-on-startup>的含义是:
标记容器是否在启动的时候就加载这个servlet。
当值为0或大于0时,表示容器在应用启动时就加载这个servlet;
当是一个负数时或者没有指定时,则指示容器在该servlet被选择时才加载。
正数的值越小,启动该servlet的优先级越高。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值