Jsp与java web
1 jsp基础知识
jsp指令:描述jsp文本转换成可执行代码的控制信息
1.include指令:包含一个静态的文件,同时解析这个文件中的jsp语句,有助于实现jsp页面的模块化
2.page指令:用于定义jsp文件中的全局属性,它描述了与页面相关的一些信息,其作用域为它所在的jsp文件页面和其包含的文件
3.taglib指令:用于定义一个标签库以及自定义标签的前缀。
jsp主要内置对象:(不需要事先声明就可以在脚本中随意使用)
1.PageContext
setAttribute
CustomContext myContext=new CustomContext("p1");
PageContext.setAttribute("abc",PageContext.SESSION_SCOPE);
getAttribute
findAttribute(???用法)
removeAttribute
2.request(用于获取和设置客户端数据:下面获取的是表单数据)
String username=request.getParameter("username");
3.session
String ii=(String)session.getAttribute("user");
4.application
String info=application.getServerInfo();
5.Config
6.reponse(用于获取和设置服务器端数据)
response.setHeader("refresh","3");
7.out(输出信息)
out.print("");
out.println("");输出后自动换行
8.Exception()
jsp常用动作语法(局部动作):
/>在页面被请求时引入一个文件
/>寻求或实例化一个javaBean
/>设置javaBean的属性
/>输出某个javaBean的属性
/>把请求转到一个新的页面
id="bean" class="t.class" />
/>
jsp+servlet+javabean mvc
javabean充当通信工具 servlet设置javabean属性 jsp读取javabean属性并显示出来
显示与逻辑得到了很好的分离,使得代码更容易管理。
web.xml
servlet类(class) servlet实例化对象(name) 访问url
JSP本质上就是把Java代码嵌套到HTML中,然后经过JSP容器(Tomcat、Resin、Weblogic等)的编译执行(jsp-servlet-class),再根据这些动态代码的运行结果生成对应的HTML代码,从而可以在客户端的浏览器中正常显示。servlet在服务器端编译执行,是服务器端程序。jsp本质是servlet的进化版本,因此也是服务器端程序。
html由浏览器解释执行,是客户端程序。输入url,请求-响应(返回服务器保存的html文件)-浏览器解释执行html代码
JavaBean是从jsp页面中分离出来的Java代码,是jsp的动态部分。
jsp中调用javabean需要jsp动作标签
先引入(import)后使用bean(实例化)
JavaBean是java的特殊类,必须具备一些特点:
JavaBean类是一个public类、有一个无参构造函数(当没有构造函数时默认无参)、属性通过set和get方法进行操作
2 session和cookie
1.1 Session部分
知识要点:
设置session
设置session默认有效时间和本session有效时间(session一定时间不使用会被摧毁)
特别注意:
session只能被对应会话使用,浏览器关闭,session虽然存在但不能被直接调用
需要依托cookie中JSESSIONID,其解决办法是:重写cookie中JSESSIONID,设置cookie有效时间。
session测试代码:
设置默认session有效时间:
在web.xml中加入以下代码(秒为单位)
1800
session处理在action中的代码:
ActionContext.getContext().getSession().put("username",username);ActionContext.getContext().getSession().put("rank",rank);String JSESSIONID=ServletActionContext.getRequest().getSession().getId();Cookie sessionId=new Cookie("JSESSIONID",JSESSIONID);sessionId.setPath("/");sessionId.setMaxAge(60*30);ServletActionContext.getResponse().addCookie(sessionId);
1.2 Cookie部分
知识要点:
利用构造方法建立cookie对象
设置Cookie有效时间(默认是-1,即一次会话有效)
指定Cookie适用的路径
用response发送cookie
用request接受cookie对象数组(硬盘上所有cookie)
判断cookie数组是否为null
cookie存在,再用遍历数组获取对应名称的cookie
使用获取的cookie的属性
jsp中使用实例:
设置cookie
检测cookie
3 过滤器与监听器
10 Filter与Listener
10.1 Filter
过滤器配置
特变主意:filter改变的是响应的编码
实例:实现编码过滤器
相关知识:
pageEncoding是jsp文件本身的编码
contentType的charset是指服务器发送给客户端时的内容编码
JSP要经过两次的“编码”,第一阶段会用pageEncoding,第二阶段会用utf-8至utf-8,第三阶段就是由Tomcat出来的网页,用的是contentType。
html响应编码
web.xml配置
encodingFilterfilter.EncodingFilterencodingutf-8encodingFilter/*
EncodingFilter.jsp
package filter;import java.io.*;import javax.servlet.*;public class EncodingFilter implements Filter{String encoding=null;FilterConfig filterConfig=null;public void init(FilterConfig filterConfig) throws ServletException {this.filterConfig=filterConfig;this.encoding=filterConfig.getInitParameter("encoding");}public void doFilter(ServletRequest request, ServletResponse response,FilterChain chain) throws IOException, ServletException {if(encoding!=null){request.setCharacterEncoding(encoding);}chain.doFilter(request, response);}public void destroy() {this.encoding=null;this.filterConfig=null;}}
10.2 Listener
*********可以监听session、request、application相应对象的生命周期变化以及对象中属性的变化情况,并可以同时产生反应。在定义*********时只需要实现相应的*********接口就行了。例如:通过对会话的监听可以实现在线人数统计,具体实现看下面的代码。
web.xml配置
listener.OnlineListenerorg.springframework.web.context.ContextLoaderListener
OnlineListener.jsp
packagelistener;importjavax.servlet.http.HttpSessionAttributeListener;importjavax.servlet.http.HttpSessionBindingEvent;importjavax.servlet.http.HttpSessionEvent;importjavax.servlet.http.HttpSessionListener;publicclassOnlineListenerimplementsHttpSessionListener,HttpSessionAttributeListener{intonlineNo=0;publicvoidsessionCreated(HttpSessionEvent event) {}publicvoidsessionDestroyed(HttpSessionEvent event) {}publicvoidattributeAdded(HttpSessionBindingEvent event) {System.out.print("a");event.getSession().getServletContext().setAttribute("online",newInteger((++onlineNo)/2));}publicvoidattributeRemoved(HttpSessionBindingEvent event) {System.out.print("b");event.getSession().getServletContext().setAttribute("online",newInteger((--onlineNo)/2));}publicvoidattributeReplaced(HttpSessionBindingEvent arg0) {// TODO Auto-generated method stub}}
4 jsp空间部署war文件
打开myeclipse选中要打包的项目,点击file-export-(输入war)选择war-选择输出文件目录-完成
直接部署war文件到ROOT根目录即可
也可以先上传war,再解压到ROOT根目录下
(注意:src中java文件必须已经编译,其class文件在WebRoot/WEB-INF/classes,这个文件在myeclipse界面看不到,需要打开文件夹)
5 路径问题
在servlet中获取web项目的全路String path = getServletContext().getRealPath("/");
在java类中获取web全路径String path= new File("").getAbsolutePath()+"\\";
6在Java中实现伪静态页面
在Java中做这个事情好像有很多中方案,比较简单的方法是使用URLRewrite的方法,把静态地址翻译成动态地址内部使用,对客户端是透明的。
我们可以使用URLRewrite,官方网站:http://tuckey.org/urlrewrite/ 。官网有很简单的示例资料。
(1)先下载urlrewritefilter.jar并导入。
(2)然后配置过滤器:
UrlRewriteFilter
org.tuckey.web.filters.urlrewrite.UrlRewriteFilter
UrlRewriteFilter
/*
REQUEST
FORWARD
(3)最后还需要在web-inf下新建一个urlrewrite.xml文件,并配置伪静态规则(静态转动态页面的规则)
"http://www.tuckey.org/res/dtds/urlrewrite4.0.dtd">
/article/showBySort.jsp/([0-9]+)/([0-9]+).html
/article/showBySort.jsp?fid=$1&id=$2
注意点:此xml中&需要使用&替换。这是sax解析造成的问题,原因是sax解析的类库在读取文件的时候是根据转义后的格式进行读取的,遇到"&"就认为是一个转义字符串,开始找结束符";",找不到自然就报错了。【&有自己的特殊含义,所以要寻找替代品】