javaEE(web开发)私人学习笔记 (4)


28、tomcat使用JNDI的配置(在<host>标签里增加):
<Context path="/test" reloadable="true"  docBase="/test"   crossContext="true" debug="0">
  <Resource 
 
  type="javax.sql.DataSource"
  auth="Container"
  username="root"
  password="root"
  driverClassName="com.mysql.jdbc.Driver"
  maxIdle="3000"
  maxWait="5000"
  url="jdbc:mysql://localhost:3306/cat"
  autoReconnect="true"
  maxActive="50"/>
</Context>

附加:
(1)虚拟目录的配置(在<host>标签里增加):<Context path="/site" docBase="c:/site" reloadable="true" debug="0"/>
(2)虚拟主机的配置(注释掉原<host>标签):<Host  appBase="E:\mywebapps">
(3)修改tomcat的内存,在myeclipse中配置tomcat的jdk参数:
-Xms256m -Xmx512m -XX:PermSize=32m -XX:MaxPermSize=128m


29、当请求路径为 "url?name=cat&age=",此时的请求参数有两个:一个是name,值为cat;另一个是age,值为空字符串""(注意不是null)。
如果参数是特殊字符,如\,在处理方法中获取参数时,会自动转义,变为\\。



30、关于servlet的Filter拦截器,不仅仅只拦截网页的请求,还会拦截网页下的资源请求(如图片,js文件等),因为浏览器在请求网页时,如果网页包含其他资源,
那么会一个个的去请求(相同的资源只请求一次),导致服务器多次受到请求处理,因此也会多次触发拦截器的请求。

附加:拦截器的拦截方法参数有ServletRequest和ServletResponse,可以转换为HttpServletRequest和HttpServletResponse。
 request.getServletPath();只包含请求路径,不包含项目名。 /index.jsp
 request.getRequestURI();包含项目名和请求路径。/test/index.jsp
 request.getRequestURL();详细的url请求路径。:8083/test/index.jsp




31、web项目的web.xml文件的配置需注意,不管是过滤器还是servlet处理器,在配置url-pattern时,都尽量使用后缀路径,例如*.action。
 
原因:因为浏览器在请求网页时,如果网页包含其他资源,那么会一个个的去请求(相同的资源只请求一次),
 例如:请求/test/as/abc.action ,服务器转发到index.jsp页面,此页面包含second.js和pic.jpg,
那么会分为三次请求:/test/as/abc.action
/test/as/second.js
/test/as/pic.jpg

当配置的路径为url-pattern为/*时,那么三次请求都将会拦截处理。如果配置为*.action,那么只会拦截/test/as/abc.action进行处理,效率大大改善。
因此,应尽量避免使用/*配置,而使用后缀方式配置。


附加:
(1)url-pattern配置是区分大小写的,例如*.ACTION与*.action是完全不同的。
(2)过滤器的执行顺序是按web.xml的 <filter-mapping>配置顺序进行执行的,特殊的,如果<filter-mapping>配置的是拦截<servlet-name>,将低于<url-pattern>,即会在<url-pattern>执行后才执行<servlet-name>而不管配置的顺序。
(3)servlet的配置时有最长匹配机制的,且/*优先*.action配置。注意,过滤器的配置是没有最长匹配机制的。
(4)如果两个servlet配置的url-pattern是一样的,那么后者会覆盖前者。注意,在任务情况下都不会让两个servlet都执行。
(5)不同的web服务器,解析web.xml的机制与要求会有差别,例如resin不允许<filter-mapping>配置在<filter>之前,而tomcat而允许,通常最好按正常像顺序配置,并且开发的web服务器与发布用的web服务区尽量保持一致。



32、使用HttpServletRequest类的对象request.getParameter("key");获取参数时,
如果参数key存在,即使客户端只有key而没有任何的请求值,该方法返回空的字符串""。
如果参数key不存在,则该方法会返回null。




33、前端的html页面,只要form表单中的input有指定name属性名,即使没有设置value属性值,在提交表单时,同样会作为请求参数进行请求,对应的value为""。
当请求参数写在url请求路径时,有key而没有value值,也同样会作为请求参数进行请求,对应的value也为""。例如?mykey&mykey2=key2val,此处有两个请求参数,mykey=""和mykey2="key2val"





34、如果想自己定制HttpServletRequest或HtppServletResponse 的某些功能,建议使用HttpServletRequestWrapper/HttpServletResponseWrapper,
  这两个类是专门的包装类,默认使用都是使用原HttpServletRequest/HtppServletResponse 的方法,可以直接重载某个方法来进行特殊功能定制,最后
    通过Filter过滤器的doFilter()方法传入包装后的类对象。




35、在Filter过滤器中,使用chain.doFilter()时,如果放行后的资源下一个处理是Servlet,且该Servet的处理方法最终使用req.getRequestDispatcher("/menu.jsp").forward(req, resp);进行转发,在执行完forward(req,resp)方法时,就把转发的menu.jsp页面写入到resp流中,而不是等全部Servlet和Filter过滤器执行完才写入。因此,在chain.doFilter()方法调用完后,当前过滤器的doFilter还没执行完就已经在resp写入相应的页面。


 注意:如果Servlet的处理方法不是使用forward转发,而是使用sendRedirect重定向,那么并不会把页面写入到resp流中,而是写入特定的头数据,通知浏览器重新请求一次该页面。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zwsswf.html