21、当Servlet的request对象的流被关闭后,应该立即退出方法,而不应该再执行方法剩余的操作。request有字节流对象(InputStream)和字符流对象(Reader),两个流对象不能同时调用,
即只能获取其中一种对象,否则报错,且这两个流对象读取的是请求体的数据,即只能读取post请求提交的参数,不能读取get的请求参数。
22、Servlet的Filter过滤器默认拦截"请求模式",即使是直接连接到jsp页面也会进行拦截(还包括图片/js/css等资源请求都会拦截)。而struts2的interceptor拦截器也是只拦截"请求模式",但是不会对资源(图片/js/css等资源)请求进行拦截,只会在对
action类的请求时才会进行拦截。Filter的拦截模式可以在web.xml中修改,但是interceptor拦截模式是不可修改的。
23、当在jsp页面中使用EL表达式时,需要注意,EL表达式可以在jsp页面中的任何地方使用,包括jsp页面中的javaScript和css等地方都可以使用,但是
如果javaScript或css被抽出来当做独立的写在一个文本中,EL表达式是不可以使用的,即不会对${}进行转义和取值,会原样输出。
24、forward请求,是属于内部转发。原来的request请求是什么请求方式,forward请求就是什么方式。即如果request请求时get,那么使用forwar转发时也是用get。post也同理。
25、EL表达式注意事项:
(1)使用EL表达式时,如果取得对象key是不存在的,那么EL表达式是不会报错的,但是如果是通过对象获取属性时,如果属性不存在则会报错。
例如:${myuser} ,如果myuser不存在存储域中,EL表达式也不会报错。
${myusers.name},如果myusers在存储域中存在,而myusers对象没有name属性,那么EL表达式将报错。
(2)对于类型的比较,EL表达式会测试着转换成相同类型进行比较,例如"true"==true,结果是true。
(3)EL表达式只会在jsp页面进行解析,不会再css文件或js文件解析,因此,需要注意独立的css和js文件中不要使用EL。
如果非要使用EL表达式,那么就不应该把css和js独立抽取出来,而是统一写在jsp页面中。
26、默认情况下,servlet是在第一次访问时被构建,并调用init()方法,如果想在服务器启动时就构建,则应配置web.xml文件:
1)load-on-startup元素标记容器是否在启动的时候就加载这个servlet(实例化并调用其init()方法)。
2)它的值必须是一个整数,表示servlet应该被载入的顺序。当值为0或者大于0时,表示容器在应用启动时就加载并初始化这个servlet;
3)当值小于0或者没有指定时,则表示容器在该servlet被选择时才会去加载。
4)正数的值越小,该servlet的优先级越高,应用启动时就越先加载。
5)当值相同时,容器就会自己选择顺序来加载。
27、当使用servlet的HttpServletRequest对象(简称request)时,必须注意以下几点:
(1)request.getParameter("arg")方法是获取get参数的,不管是get还是post请求,都会自动的获取对应请求参数。对于get,会自动在url地址栏后边取值,对于post,会自动在请求体里面取值。
(2)request.getInputStream()和request.getReader()方法不能都使用,同个request对象只能使用其中一个。附:此方法对于get无作用。
(3)当使用post请求时,request.getParameter("arg")会和request.getInputStream()、request.getReader()互相干扰,因为getParameter()方法就是同个流读取参数的,
因此,如果先调用了getParameter()方法,那么request.getInputStream()、request.getReader()都将无法再读取到请求体数据。故,不能都使用,只能使用其中一种。
(4)当使用的是混合表单时,request.getParameter("arg")是无法获取参数的,此时就只能通过request.getInputStream()、request.getReader()来获取。
(5)request.getParameter("arg")、request.getParameterMap()、request.getParameterNames()这些方法是不会互相影响的,可以同时使用。
(6)对应请求数据时xml数据包的,用request.getInputStream()和request.getReader()方法直接读取是会出现数据不正确的情况,而应该直接把request.getInputStream()和request.getReader()
得到的流通过dom4j等jar包进行解析,从而获得正确的xml数据。