jsp生成页面
访问xxxx/xxx/hello.jsp?name=tom。
1.查找jsp对应的servlet存在,就直接访问。
2.不存在,就解析jsp,翻译成servlet源文件,编译成servlet类,初始化运行。
只有第一次访问,或者修改jsp或者编译后的servlet文件删除了才会重新解析编译。
Jsp语法
Jsp指令
Jsp使用<%@ 指令名 属性=“值”%>一般常用page,include,taglib。
1.Page指令
page指令用来指定使用的编程语言,导入的软件包等等。
<%@ page 属性1=“值1” 属性2=“值2”%>2.include指令
用来包含其他文件内容,可以是jsp或html文件。静态包含。
<%@ include file="xxx.jsp"%>Jsp声明<%! int a=10;int b=20;%>java程序片段<% int a=10;if(a==10){%>a is 10.<%}else{%>a is not 10<%}%>Java表达式<%=request.getParameter("name");%><%-- 注释 --%>隐含对象jsp可以使用固定的变量来访问隐含对象。
请求转发跟servlet一样
<jsp:forward page="转发的url"> 在这句话前后的显示代码都没用(比如<p>hello world</p>)。跟servlet一样,当前的响应结果是没有用的,只有转发到一个地址后的响应结果有用。转发后的jsp里面可以使用request和response。因为转发共用HttpServletRequest和HttpServletResponse。
<jsp:forwars page=""> <jsp:param name="" value=""/>//添加参数在<jsp:include>中也可以使用<jsp:param name="" value=""/></jsp:forward>包含<jsp:include page="">//跟include指令一样都可以包含文件,但是指令是静态包含,这个是动态包含静态包含:就是解析的时候把代码和jsp文件一起解析,然后编译,加载。非首次访问,没更新就不重新解析。静态包含更新了,有些容器(tomcat)会监测更新然后重新解析编译。有些不会,只能删除jsp生成的servlet文件和类文件,然容器重新解析。jsp更新了,应该重新解析。
动态包含:运行jsp时解析包含的文件。
flush属性:true指在包含之前jsp就把响应结果发给客户。默认为false。
一般不会变的内容用静态包含,会变的内容用动态包含。
使用servlet或jsp要在web.xml中配置
<servlet> <!-- 声明Servlet对象 --> <servlet-name>FirstServlet</servlet-name> <!-- 上面一句指定Servlet对象的名称 --> <servlet-class>com.ningmeng.FirstServlet</servlet-class>或者使用<jsp-file>/xxx.jsp</jsp-file>用jsp来当servlet <!-- 上面一句指定Servlet对象的完整位置,包含包名和类名 --> </servlet> <servlet-mapping> <!-- 映射Servlet --> <servlet-name>FirstServlet</servlet-name> <!--<servlet-name>与上面<Servlet>标签的<servlet-name>元素相对应,不可以随便起名 --> <url-pattern>/FirsetServlet</url-pattern> <!-- 上面一句话用于映射访问URL --> </servlet-mapping>Jsp预编译第一次访问可能会等待很长一段时间,所以可以进行预编译。
..../hello.jsp?jsp_PRecompile=true就会生成class文件,删除hello.jsp,在web.xml中配置路径为生成的class文件。作用:
1.提高了响应速度。2.应用发布后,可以防止他人修改jsp文件或者查看。因为jsp文件删除了。
PageContext
使用场合:jsp文件java程序片段中;jsp文件自定义标签的处理类。
用法:
1.向各种范围存取属性。
2.得到其他对象的引用方法。
3.用于请求转发和包含的方法。
1.存取属性值。
getAttribute(String name);getAttribute(string name , int scope);在scope中取值setAttribute(String name , Object value, int scope);在scope中设置值removeAttribute(string name , int scope);移除scope中的值findAttribute(String name);依次从小到大的范围查找,找到马上返回。否则为null。int getAttributeScope(String name);返回属性范围,没有返回0PageContext.PAGE_SCOPE取值为1,页面范围//scope属性PageContext.REQUEST_SCOPE取值为2,请求范围PageContext.session_SCOPE取值为3,会话范围PageContext.application_SCOPE取值为4,应用范围2.得到其他对象的引用getPage();getSession();getRequest();getResponse();getServletConfig();getServletContext();getOut()自定义标签处理类中不能使用servletContext,request,response,可以使用pageContext来得到。3.请求转发和包含
forward(String url),include(String url);
因为自定义标签中无法使用<jsp:forward>和<jsp:include>.所以使用pageContext来实现。
编码
request.setCharacterEncoding("utf-8");//对post有用,因为post数据在request域中.对get没用,因为数据在header中 String a = request.getParameter("name"); String b= request.getParameter("value");//post和get都可以用。 String c = new String(b.getBytes("ISO-8859-1"),"UTF-8");//一般浏览器请求的都是iso-8859-1编码。
新闻热点
疑难解答