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 过滤器与监听器
过滤器配置
特变主意:filter改变的是响应的编码
实例:实现编码过滤器
相关知识:
pageEncoding是jsp文件本身的编码
contentType的charset是指服务器发送给客户端时的内容编码
JSP要经过两次的“编码”,第一阶段会用pageEncoding,第二阶段会用utf-8至utf-8,第三阶段就是由Tomcat出来的网页,用的是contentType。
html响应编码
详细参考资料:http://www.cnblogs.com/kevin-yuan/archive/2011/12/31/2308479.html
web.xml配置
encodingFilter
filter.EncodingFilter
encoding
utf-8
encodingFilter
/*
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;
}
}
*********可以监听session、request、application相应对象的生命周期变化以及对象中属性的变化情况,并可以同时产生反应。在定义*********时只需要实现相应的*********接口就行了。例如:通过对会话的监听可以实现在线人数统计,具体实现看下面的代码。
web.xml配置
listener.OnlineListener
org.springframework.web.context.ContextLoaderListener
OnlineListener.jsp
package listener;
import javax.servlet.http.HttpSessionAttributeListener;
import javax.servlet.http.HttpSessionBindingEvent;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
public class OnlineListener implements HttpSessionListener,HttpSessionAttributeListener{
int onlineNo=0;
public void sessionCreated(HttpSessionEvent event) {
}
public void sessionDestroyed(HttpSessionEvent event) {
}
public void attributeAdded(HttpSessionBindingEvent event) {
System.out.print("a");
event.getSession().getServletContext().setAttribute("online", new Integer((++onlineNo)/2));
}
public void attributeRemoved(HttpSessionBindingEvent event) {
System.out.print("b");
event.getSession().getServletContext().setAttribute("online", new Integer((--onlineNo)/2));
}
public void attributeReplaced(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解析的类库在读取文件的时候是根据转义后的格式进行读取的,遇到"&"就认为是一个转义字符串,开始找结束符";",找不到自然就报错了。【&有自己的特殊含义,所以要寻找替代品】