jsp/servlet

JAVAWEB
目录
一、 JSP 1
二、 Servlet 11
三、 自定标签 16
四、 EL 16
五、 JSTL 17
六、 Listener 17
七、 Filter 17
七   WEB应用安全 17
八、 小知识 17

一、JSP
1.介绍
Jsp(java server page) 动态WEB网页。
2.注释
Html注释
<!-- Html注释 - ->
Jsp注释
<%-- Jsp注释  --%>
隐式注释生成的页面中不可见;
3.声明
<%@ page language=”java” contentType=”text/html;charset=utf-8” errorPage=”true/false” %>
<!doctype html>
<html>
<head>
<meta charsets=”utf-8” />
<title>newhtml</title>
</head>
<body>

Html文档体

</body>
</html>
4.输出jsp表达式
<!- - 表达式输出  - ->
<%=值/变量/%>


5.脚本
脚本是在JSP中嵌套java代码。

<%
java代码。
%>
6.指令
1)编译指令
Page指令
Page指令一般位于页面顶端,一个页面可以有多个page指令
<%page
[lang=”java”]
[extends=”package.class”]
[import=”包1,包2,……”]
[session=”true|false”]
[buffer=”true|false”]
[auto=”flush”]
[isThreadSafe=”true|false”]
[info=”text”]
[errorPage=”relativeURL”]
[contentType=”text/html;chatset=utf-8”]
[pageEncodeing=”UTF-8”]
[isErrorPage=”true|false”]

%>
说明:
Lang 选择语言
Extends jsp继承的父类,或实现的接口
Session 设置页面是否需要HttpSession
Buffer 指定缓存区的大小
AutoFlush 是否需要强制输出缓冲区的内容
Info jsp页面信息
errorPage 指定错误页面
include指令
静态包含,可以将一个外部文件页面嵌套到本页面中。
<%@ include page=”文件路径”%>

2)动作指令
Forward指令
Forward指令用于将页面响应转发到另外的页面
使用:
<jsp:forward page=”url ”/>
Inlucde 指令
Include动态包含,它不会导入被include页面的编译指令,仅仅将被导入的页面插入到本页面中。在使用时须要把falush设置为true
使用:
<jsp:include page=”url”/>
静态包含与动态包含的区别:
<jsp:include page=”” flush=true />它总是会检查所含文件中的变化,适用于包含动态页面,并且可以带参数,,表态包含用伪码实现,不会检查所含文件的变化,适用于包含表态页面<%@ include file=””%>
执行时的时机不同,动态include是在运行时把两个JSP合并,静态是在编译期合并,动态include在页面发生改变时能及时更新,而静态页面不会再次重新编译.

UseBean、setProperty、getProperty指令
  用于操作javaBean 的设置值与取值
useBean
<jsp:useBean id=”name”class=”bean类路径”scope=”作用域”/>
作用域:page、request,session,application;
setProperty
  给bean设置值;
<jsp:property name=”beanName”property=”属性名”value=”值”/>
getProperty
从bean中取值
<jsp:getProperty name=”beanName”property=”属性名”/>
Plugin指令
Plugin指令用于下载服务器端applet程序。
不推荐使用,
<jsp:plugin code=""  codebase="" type="applet"></jsp:plugin>
Param指令
<jsp:include page=””/>
<jsp:forward page=””/>
<jsp:plugin code=""  codebase="" type="applet"></jsp:plugin>
当与include结合使用时,param指令用于将参数传入被导入的页面中;
当与forward时,param用于将参数值传如入被转向的页面;
当与plugin时,将param传入页面中的javaBean实例或applet实例中
使用:
<jsp:param name=”name”value=”value”/>

7.内置对象
Application
对于整个Web应用有效,一旦JSP,Servlet将数据放入application中,该数据将可以被该应用下的其它JSP,Servlet访问。

让多个JSP,Servlet共享数据
JSP
一个JSP
<%
application.setAttribute(“name”,value);

%>

其它JSP
<%=application.getattribute(“name”)%>
Servlet
//存值与取值
ServletContext application=getServletConfig.getServeltContext();

Application.setAttribute(“name”,object);

Application.getAttribute(“name”);



获取web应用配置参数
Web.xml
<context-param>
<param-name>name</param-name>
<param-value>value</param-value>
</context-param>
//jsp获取值
<%=application.getInitParameter (“name”) %>
//Servlet获取值
ServletContext application=getServletConfig.getServletContext();
Application.getInitParameter (“name”);



Config
Config对象代表当前jsp配置信息,
Exception
简单实用
设置可能发生异常的页面,
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" errorPage="error_exception.jsp"%>
指定错误页面。
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" isErrorPage=”true”  %>

对错误页面设置
Out
Out对象代表一个页面输出流,通常用于在页面上输出变量或常量值。

使用:
<%
out.print(变量/常量);
%>

pageContext
上下文对象,该对象主要用于JSP之间的共享数据。使用pageContext可以访问page request session application


获取其它内置对象

ServletRequest.getRequest();//request

ServetResponse.getResponse();//response

ServletConfig.getConfig();//config

ServletContext.getContext();//application

HttpSession.getSession;//session

使用:
<%
pageContext.setAttribute(“test”,”text”,pageContext.作用域);
pageContext.setAttribute(“test”,”value1”,pageContext.RQUEST_SCOPE);

out.println(pageContext.getAttributesScope(“test”));



%>
<%=pageContext.getAttribute(“test”)%>
对象
Request
Request对象封装着用户的一次请求,并且所封装的请求参数都被封装在request对象中,除此之外可代表本次请求范围,还可以操作request范围的属性和方法。

<%
Object value  = Request.getParameter(“key”);
Out.println(request.属性或方法);
%>
Response
Response 代表服务器对客户端的响应。
去缓存
response.setHeader("Pragma","No-cache");    
response.setHeader("Cache-Control","no-cache");    
response.setDateHeader("Expires", -10);   


响应类型
用于返回响应类型给用户
<%
Response.setcontentType(“mini头;响应编码”);
Response.setContentType(“imge/jpeg;chatset=utf-8”);


%>
<%@ page contentType=” imge/jpeg;chatset=utf-8”%>
重定向
<%
Response.sendRedirect(url);
%>

增加cookies
Cookies 通常用于记录表单信息。
<%
String value=”test”
Cookies test=new Cookes(“test”,value);
Test.setmaxage(60*60*7)(ms)
Response.addCookie(test);
%>
得到Cookies
<%
Cookies[] cookies=request.getCookies();
for(cookie :cookies)
{
//获取Cookies名为test的值
If(“test”.equals(cookie.getName()))
{
Out.print(cookies.getValue());
}
}


%>
Cookie中文处理
因为cookie不支持中文所以在使用前需要使用URLEncode编码。
获取cookie值使用URLDencode解码

Session
Session对象是一个非常有用的对象,这个对象代表一次会话,关闭浏览器结束会话,
HttpSesion 常用的两个方法
setAttribute(“key”,value)  //设置名为就key的Session会话
getAttribute(“key”) // 获取指定名的session的会话
Page
二、Servlet
1.介绍
Jsp本质上就是一个servlet,
2.配置
Servlet3.0配置
在Servelt类中使用@WebServlet Annotation进行配置
通过web.xml文件中配置
WebServlet 支持常用属性
属性 是否必要 说明
asyncSupportted 否 指定Servle是否支持异步操作模式
displayName 否 指定该Servlet显示名
initParams 否 用于是否为Servelt配置参数
loadOnStartUp 否 用于将该Servlet配置成load-on-startup的servelt
Name 否 指定该Servlet名称
urlPatterns/value 否 这两个属性一样
使用前:



Servelt2.5配置
1、新建类并实现HttpServlet 重写相应的方法;
2、打开在WEB-INFO下的web.xml配置文件
在web-app节点下添加标签
<servlet>
   <servlet-name>servelt名</servlet>
               <servlet-class>类的路径<servlet-class>
    </servlet>
//映射路径
<servlet-mapping>
<servlet-name>servlet名</servlet-name>
<url-pattern>请求路径</url-pattern>
</servlet-mapping>
    
3.生命周期
Servlet 里面的方法
Init();//初始化对象

Destory();//销毁对象
提交的方式:
Post() 用于响应客户端的POST请求
Get() 用于响应客户端的GET请求

Doput() 用于响应客户端的PUT请求

Dodelete() 用于响应客户端的delete请求

Service() 当没有GET 和 POST用于响应客户端的Service 请求


4.Load-on-startup
Load-on-startup元素或load-on-startup属性只能接受一个整形值,这个值越小越好,Servlet就越先实例化。

配置load-on-startup的两种方式


Servlet3.0配置
通过@WebServlet Annotion的loadOnStartUp属性
        简单实用:

Servlet配置
<servlet>
<servlet-name>name</servlet>
<servlet-class>类路径<servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
5.访问servlet配置参数
配置Servlet时,还可以给servlet添加初始化参数,以实现提供更好的移值性。
Servlet3.0配置参数
@WebServlet(
//设置servlet名字
name=”test”,
//设置servlet请求路径
urlPatterns={”/test”},
//设置初始化参数 可以设置多个
initParams={
@WebInitParam(name=”key”,value=”test”)
})

Servlet配置参数
<servlet>
<servlet-name>name</servlet>
<servlet-class>类路径<servlet-class>
<init-param>
            <param-name>key</param-name>
            <param-value>value</param-value>
        </init-param>
</servlet>
在页面/servlet中取得参数:

<%
String key=config.getInitParameter(arg0);
%>

ServletConfig config = getServletConfig();


6.使用servlet作为控制器
用于控制视图( View ),
7.线程安全
Servlet是本身是一个线程不安全的
解决线程安全
在dopost 或doget 前加上synchronized 

三、自定标签
自定义标签的作用就是不在JSP中写脚本
1.自定义标签(CustomTag)
使用步骤:
新建class 处理自定义标签
新建的类必须继承javax.servelt.jsp.tagxt.SimpleTagSupport;
在dotag 完成标签的功能
获取页面输出流
Writer out=getJsp().getOut();
获取属性
有属性的标签,使用Getters ,Setters 获取属性值。
获取标签体
StringWriter sw = new StringWriter();
      getJspBody().invoke(sw);
新建*.tld文件,每个tld文件对应一个标签库,每个标签库可以对应多个标签。
<taglib xmlns="http://java.sun.com/xml/ns/j2ee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
version="2.0">
<description>A tag library exercising SimpleTag handlers.</description>
    <tlib-version>1.0</tlib-version>
    <short-name>SimpleTagLibrary</short-name>
    <uri>/SimpleTagLibrary</uri>
<tag>
<name>标签名</name><!--必须- ->
<description>标签说明</description><!--可选 - ->
<tag-class>指定类的路径</tag-class><!—必须 - ->
<!- 指定标签体必须为空   - ->
<body-content>empty</body-content><!—必须 - ->
说明:
body-content:
Empty :指定标签体为空
Jsp :指定标签体可以是JSP脚本
Scriptless :不可心使用JSP脚本
Tagdependent :指定该标签是否支持动态属性

<!—给标签添加属性- ->
<attribute>
<name><name>
<required></required>
< fragment></ fragment>
</attribute>
说明:
attribute:
name : 指定属性名
required :是否必选
fragment :是否可以使用JSP脚本
</tag>
使用自定义标签
添加标签库
<%@ tag  uri=”” prefix=”simple”%>
<simple:自定义标签名 属性=“值” >
标签体
</simple:自定义标签名 >

四、EL
EL的标识
禁用
isELIgnored="false"
     使用
${变量}
${对象名.属性名}
${对象名[‘属性名’]}  属性名用双引号括起来,当属性名有下划线时采用这 种方式

属性范围
Page pageScope
Request requestScope
Session sessionScope
Application     applicationScope
当不加  作用域Scope
${属性/变量}
默认是从小开始找
page request session application
当动态输出时使用
必须使用${对象名.属性名}
Empty
${empty expression/变量},null,””,0长度的集合或数组。

${not empty expression/变量}  取反


五、JSTL标签库
Jsp标记标签库(jsp standard tag library)
标签库uri   :选择使用的标签库
标签名 :选择使用那个标签
导入标签库 :使用编译指令导入标签库,就是将标签库和指定的前缀联起来。
使用   :<%@ tag  uri=”” prefix=”simple”  %>
  <simple:标签名 />
核心标签
   Core:
<c:foreach>
<c:if>
<c:choose>

Function:
结合c标签使用

注意:
·Jstl1.1 jstl1.2区别
Jstl 1.2l只需要 导入一个包jstl 1.2.jar
Jstl 1.1 需要jstl 1.1.jar stand.jar

六、Listener
在WEB容器中 ,WEB应用内部会不断的发生各种事件,如web应用被启动, web应用被关闭。通常来说,这些web事件对开发者都是透明的。
常用的事件监听器的接口
ServletContextListener: 用于监听应用的启动和关闭
ServletContextAttributeListener 用于监听ServletContext(application)属性改变
ServletRequestListener 用于监听用户的请求。

ServletRequestAttributeListener     用于监听HttpRequest (request)范围内属性值的改变

HttpSessionListener 用于监听用户Session的开始和结束
HttpSessionAttributeListener 用于监听HttpSession(session)范围属性的改变

实现接口重写的方法
contextCreated :
contextDestroyed :

监听器的用途
监听用户上线与退出
显示在线用户

使用监听器
创建Listener类并实现 Listener接口
  配置Listener
<listener>
<display-name>显示名</display-name> 可选
    <description>说明</description>    可选
<listener-class>指定监听器的类路径</listener-class>

</listener>

注:配置Listener 应在filter 和 Servlet 前
七、Filter
Filter 可以认为是servlet的加强版,它主要用于对用户请求进行预处理,也可是
对HttpServletResponse进行后处理,是个典型的处理链
Filter的好处
在HttpServletRequest到达Servelt之前,拦截客户的HttpServletRequest
根据需要检查HttpServletRequst,也可以修改HttpServletRequest头和数据。
在HttpServletRequst到达客户端之前,拦截HttpServletResponse
根据需要检查HttpServletResponse, 也可以修改HttpServletRequest头和数据。

Filter的用途
用户授权 :根据请求过滤用户非法请求。
日志 :详细记录用户的操作
负责解码
改变XML内容
数据处理    :当出现违反党的关键字,使用(*)替换
可以拦截多个请求或响应 可以配置多个url- pattern


创建
创建Filter必须实现javax.Servlet.Filter接口,并实现相应的方法。
Init()   //初始化
Destroy()   //销毁
doFilter()  //过滤逻辑
其中doFilter是完成过滤器链 当后面没有过滤器是将找Servlet
配置
  配置filter时,应在Servlet前
<filter>
<filter-name>name</filter-name>
<filter-class>类路径</filter-class>
<init-param>
<param-name>初始化参数<param-name>
<param-value>初始化参数值</param-value>
注:可以配置多个 ;
</param>
</filter>
filter映射
<filter-mapping>
<filter-name></filter-name>
<url-pattrn></url-pattrn>
注:url-pattrn可以添加多个拦截的url
</filtermapping>

使用URL Rewrite 实现网站的伪静态
七   WEB应用安全
八、小知识
防盗链:
判断当前是否有用户登录,否认跳转到登陆页面
<%
Object object=session.getSession(“user”);
    If(object==null)
{
Response.sendRedrict(“login.jsp”);
}
%>
数据库连接池:
C3P0
DBCP
Druid
是一个JDBC组件,它包括三部分:
DruidDriver 代理Driver,能够提供基于Filter-Chain模式的插件体系。DruidDataSource 高效可管理的数据库连接池。
    SQLParser
日志记录:
Log4j日志记录。
一般记录使用者对应用的所有操作。
使用前要导入第三方jar包。log4j-1.2.17.jar
然后新建 log4j.properties属性文件,
配置文件的日志级别
log4j.rootLogger  = {ERROR(错误信息)|
WARN(警告信息) |
INFO(提示信息)  |
DEBUG(调试信息)}
,appender1(定义输出的方式的变量,可以有多个。)
配置日志的输出方式,可以是文件,控制台输出。
log4j.appender.appender1=
org.apache.log4j.ConsoleAppender(控制台输出)
org.apache.log4j.FileAppender(文件)
    org.apache.log4j.DailyRollingFileAppender(每天产生一个日志文件)
org.apache.log4j.RollingFileAppender(文件大小到达指定尺寸的时候产生一个新的文件)
org.apache.log4j.WriterAppender(将日志信息以流格式发送到任意指定的地方) 配置日志文件的布局
log4j.appender.appender1.layout=
org.apache.log4j.TTCCLayout(包含日志产生的时间、线程、类别等等信息) org.apache.log4j.HTMLLayout(以HTML表格形式布局),
org.apache.log4j.PatternLayout(可以灵活地指定布局模式),
org.apache.log4j.SimpleLayout(包含日志信息的级别和信息字符串),
自定义样式
log4j.appender.appender2.layout.ConversionPattern=
%r 时间 ${yyyy-MM-dd hh:MM:ss} 
%t 方法名 main 
%p 优先级 DEBUG/INFO/ERROR 
%c 所属类的全名(包括包名) 
%l 发生的位置,在某个类的某行 
%m 输出代码中指定的讯息,如log(message)中的message 
%n 输出一个换行 
文件上传下载:( form enctype="multipart/form-data")
Servlet 可以与 HTML form 标签一起使用,来允许用户上传文件到服务器。上传的文件可以是文本文件或图像文件或任何文档。
1.Smartupload
上传
Smartupload
    首先实例化对象
Smartupload su=new Smartupload();
   初始化对象
Su.initialize(getServletConfig,request,reponse);
允许上传的类型,多个类型使用豆号分隔
su.setAllowedFilesList(“jsp,axp”);
设置上传文件的大小
su.setMaxFileSize()   单位b
                设置全部文件的上传大小
su.setTotalMaxFileSize()

开始上传
Su.upload();
Su.save(String path); 文件上传的路径

下载
首先实例化对象
Smartupload su=new Smartupload();
   初始化对象
Su.initialize(getServletConfig,request,reponse);
设定contentDisposition为null以禁止浏览器自动打开文件
su.contentDisposition(null);
开始下载
Su.downFile(文件路径+文件名);
2.Common-upload
发送邮件:

数据分页
分页模型
Public class PageModel<?>{
//存放数据集
private List<T> list;
//数据总条数
private int totalRecords;
//每页显示的记录条数
private int pageSize;
//当前页码
private int pageNo;
/*省略getter setter 方法*}
注:总的页码:总的记录条数/每页显示的记录条娄
例:(int)Math.ceil((bouble)totalRecoreds/pageSize)

搜索AND 分页
多条件查询
例:
Public PageMobel<实体> serach(int pageNo,int pageSize,Entity entity){
List<Object> keys= new ArrayList<Object>();
StringBuffer sql=new StringBuffer(“SELECT 要查询的字段FROM 表名 WHERE 1=1”);
//判断实体属性中是否有key
If(entity.getFilds()!==||””.equals(entity.getFilds())){
//拼凑sql
Sql.append(“ AND key LIKE ?”);
//将属性添加到集合中
Key.add(entity.getFilds());
}
通过prepardStatement预处理sql
For(int i=0;i<keys.size();i++)
{
Pstmt.setObject(i+1;keys.get(i));
}
验证码插件
网上有很多写好的例子
kapatcha-2.3.2的配置和使用
kaptcha-2.3.2.jar放到WEB-INF/lib目录下
配置web.xml
<servlet>
<servlet-name>Kaptcha</servlet-name>
<servlet-class>com.google.code.kaptcha.servlet.KaptchaServlet</servlet-class>
<!- 通过初始化参数配置 验证码的属性-
</servlet>
<servlet-mapping>
<servlet-name></servlet-name>
<url-pattrn> Kaptcha .jsp</url-pattrn>
</servlet-mapping>
使用
<img src=” Kaptcha.jsp” onclick=”this.src+new Date().getTime()”>

防表单重复提交
Post Redirect Get
表单提交到服务器,然后使用重定向一个请求,通过新的请求中转发到视图




猜你喜欢

转载自lishdfsdf.iteye.com/blog/2249931
今日推荐