除了servlet规范,还有filter,listener。filter和servlet相似,但是在servlet之前执行,主要区别是有一个FilterChain接口可以执行拦截方法。

 import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
/*Filter和Servlet结构相似,有两个生命周期方法和一个执行任务的方法,且配置格式相同
* 注意url的不同,Filter的url是要拦截的url,而Servlet的url是访问时使用的url
* 当用户访问相应的url路径时,会执行Filter的doFilter()
*
* 注意:下面的@WebFilter部分是Servlet3的新特性,是过滤器的注解,不需要在web.xml进行配置,简化的配置文件信息
*/
@WebFilter({ "/BFilter", "/AServlet" })
public class AFilter implements Filter { /*这里的参数FilterConfig对象和ServletConfig相似
*/
public void destroy() {
System.out.println("A拦截器死亡");
} /*下面的参数FilterChain对象只有一个方法doFilter(),
* 该方法可以执行目标资源(即被拦截的资源),也可以执行下一个拦截器(如果有的话,像一条链一样)
*/
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
System.out.println("A成功拦截");
chain.doFilter(request, response); //执行这句话就可以执行被拦截的url要进行的操作
System.out.println("A执行完上面在回来");
} public void init(FilterConfig fConfig) throws ServletException {
System.out.println("hahahah...,A拦截器出生");
} }

filter简例

listener和它们稍有不同,是对特定事件的监听和处理。

 import javax.servlet.ServletContextAttributeEvent;
import javax.servlet.ServletContextAttributeListener;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;
import javax.servlet.http.HttpSessionBindingEvent;
import javax.servlet.http.HttpSessionBindingListener; /*listener监听器也是Javaweb三大组件之一,也需要在web.xml中进行配置
* 监听器就是用来对特定事件进行监听,并作出相应的行为,所以监听器都是接口,需要用户自己完成对行为的定义
* Javaweb中有8个监听器,其中有6个对3大域(ServletContext/HttpSession/ServletResquset)进行监听,
* 其中一个监听域的生命周期,一个监听域的属性
* 只要实现相应接口即可完成监听,下面就是对ServletContext生命周期的监听(即对init()和destroy()监听)
*/
@WebListener
public class Dlistener implements ServletContextListener, ServletContextAttributeListener,HttpSessionBindingListener{
public Dlistener() {
} /*监听器的另一个重要的方面就是事件对象,这是自动传入的,可以对事件进行分析然后采取不同的处理方式
* 在生命周期监听器中,事件对象的主要方法是获取相应域对象
*/
@Override
public void contextDestroyed(ServletContextEvent arg0) {
System.out.println("死亡!");
} @Override
public void contextInitialized(ServletContextEvent arg0) {
System.out.println("出生!");
} /*属性监听器:用于对属性的设置/重置/移除等事件的监听,
* 这种监听器的事件对象可以获取操作的属性的键值对,
*/
public void attributeAdded(ServletContextAttributeEvent event) {
System.out.println("您向application中添加了一个名为" + event.getName() + ", 值为:"
+ event.getValue() + "的属性");
} //注意重置时,事件对象获取的是被操作的属性键值对(即原来的),同时可以通过域对象获取新的键值对
public void attributeReplaced(ServletContextAttributeEvent event) {
System.out.println(event.getName() + "=" + event.getValue() + ", "
+ event.getServletContext().getAttribute(event.getName()));
} public void attributeRemoved(ServletContextAttributeEvent event) {
System.out.println(event.getName() + "=" + event.getValue());
} /*8个监听器还有两个,可称为感知监听器,都与HttpSession有关
* 特点是:1、添加在javabean中而非域中,2、不需在web.xml中配置
*
* 一个是HttpSessionBindingListener,绑定在一个JavaBean中,可以使其感知是否被session添加/移除
* 另一个是HttpSessionActivationListener,同样绑定在JavaBean中,可以感知是否绑定session并且这个
* session是否钝化或重新活化
*/
private String username;
private String password;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
} public Dlistener(String username, String password) {
super();
this.username = username;
this.password = password;
}
@Override
public String toString() {
return "User [username=" + username + ", password=" + password + "]";
} //下面两个是HttpSessionBindingListener监听器方法,感应该javabean是否被session保存和移除
@Override
public void valueBound(HttpSessionBindingEvent event) {
System.out.println("啊~,session添加了我!");
}
@Override
public void valueUnbound(HttpSessionBindingEvent event) {
System.out.println("哇哇哇~,无情的session抛弃了我!");
}
}

listener简述

JSP是Java server pages,是java的view层即响应的基础,=html+Java代码+Java指令,

在第一次访问JSP文件时,服务器会将其转换为Java文件,并编译为class字节码文件,然后创建对象。这个对象内部会生成一些对象,包括域对象;也会对java指令进行解释执行,并且对参数进行赋值,最后将执行之后的html代码相应给客户端。

Java指令,包括三种:

  1、page指令,是对文件的全局设置,比如响应的编码等<%@page ...%>

  2、include指令,静态包含引入文件,<%@include ...%>

  3、taglib,导入标签库.最基础使用的是JSTL和fmt标签库。其中JSTL标签库是重点:可以进行判断,循环等复杂逻辑。注意:使用JSTL标签库需要导入相应jar包,myeclipse中已经默认添加,所以可以直接使用。   

 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%--
这里使用的是JSTL的核心库标签:core,也被称为c标签,前缀通常使用c
--%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%--
这里使用的是JSTL的格式化标签库:fmt,
--%>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>"> <title>My JSP 'JSTL.jsp' starting page</title> <meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
--> </head> <body>
<%--下面三个标签是用于设置/输出/移除域中属性,可以设置指定域,设置时默认对特殊标签进行转义,默认域为page--%>
<c:set var="xxx" value="<script>alter('hello');</script>" scope="page"/>
<c:out value="${xxx}" /><br/>
<c:remove var="xxx" scope="page"/>
<c:out value="${xxx}" default="该值不存在或已被删除"/><br/> <%--下面是两种生成url的方式比较 --%>
${pageContext.request.contextPath}/Aservlet<br/>
<c:url value="/AServlet">
<c:param name="username" value="张三"></c:param>
</c:url>
<br/> <%--JSTL标签还可以替换判断语句和循环语,
判断语句分两种:1、单个判断,2、多个判断
--%>
<%--
注意:判断是否为空时,格式为not empty ***/empty ***
--%>
<c:if test="${not empty xxx}">
hello<br/>
</c:if>
<c:set var="fen" value="60" />
<c:choose>
<c:when test="${fen>100||fen<0}">
错误的分数<br/>
</c:when>
<c:when test="${fen<60}">
不及格<br/>
</c:when>
<c:when test="${fen>=60}">
及格<br/>
</c:when>
</c:choose>
<%--循环有两种,一种是计数循环;一种是遍历循环,用于集合和数组 --%>
<c:forEach var="i" begin="1" end="10" step="2">
${i}<br/>
</c:forEach>
<%
String[] str={"a","b"};
request.setAttribute("str", str);
%>
<%--!!!注意下面在items属性值的结束"之前不要有多余的空格,否则会出错--%>
<c:forEach items="${requestScope.str}" var="string">
${string}<br/>
</c:forEach> <%
Date d=new Date();
request.setAttribute("date",d);
%>
<fmt:formatDate value="${date}" pattern="yyyy-MM-dd HH:mm:ss"/>
<br/>
</body>
</html>

jstl标签库使用

    参考:http://www.cnblogs.com/lihuiyy/archive/2012/02/24/2366806.html

java代码是在jsp中运行java程序片段,但是不建议过多使用。

在jsp页面和java代码之间传递数据使用的是四大域对象,在代码中通常通过HttpRequestServlet来获取其他几个域对象,而且这个除了是请求对象本身就是Request域对象,参考:http://www.cnblogs.com/jbelial/archive/2013/07/11/3184928.html

JavaBean就是一个满足特殊规范的类:(最早用于创建图形化界面时拖拽控件时使用,一个控件对应一个JavaBean类)

参考:http://davidgjy.iteye.com/blog/442749

 public class Person {
/*该类就是一个javabean的示例,规范是:
* javaBean的规范:
* 1. 必须要有一个默认构造器
* 2. 提供get/set方法,如果只有get方法,那么这个属性是只读属性!
* 3. 属性:有get/set方法的成员,还可以没有成员,只有get/set方法。属性名称由get/set方法来决定!而不是成员名称!
* 4. 方法名称满足一定的规范,那么它就是属性!boolean类型的属性,它的读方法可以是is开头,也可以是get开头!
*
*/
private String username;
private int age;
private String sex; public Person(String username, int age, String sex) {
super();
this.username = username;
this.age = age;
this.sex = sex;
}
public Person() {
super();
} //第三条指的是如下面的情况:get后面使用的name,而成员是username时以get后为准,
public String getName() {
return username;
}
public void setName(String username) {
this.username = username;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
//一个属性可以只有get/set方法而没有成员
public String getId(){
return "89757";
} @Override
public String toString() {
return "Person [username=" + username + ", age=" + age + ", sex=" + sex + "]";
} }

javabean示例

操作JavaBean可以使用内省,内省是基于反射的一种实现,可以获取beaninfo(其中包含对应Javabean的信息),操作流程如下

  内省类 --> Bean信息 --> 属性描述符 --> 属性的get/set对应的Method! --- > 可以反射了!

但是apache提供了一个jar包,可以方便的实现上述操作

 import java.util.HashMap;
import java.util.Map; import org.apache.commons.beanutils.BeanUtils;
import org.junit.Test; import cn.dqxst.utils.CommonUtils; public class BeanUtilsDemo {
/*在myeclipse中使用junit单元测试,
* 只要在需要测试的前加 @Test ,注意有大小写区别,就会提示导入测试所需的包
*/
@Test
public void fun1() throws Exception {
String className="cn.dqxst.domain.Person";
Class<?> clazz=Class.forName(className);
Object bean=clazz.newInstance();
//BeanUtils可以代替繁琐的反省操作,直接对JavaBean操作
/*如果某个属性没有设置不会报错,
* 注意该类对属性值的处理:都会转换为字符串,然后在赋值时按需要进行转换
* 并且在获取属性时,会将其值转换为String类型,可以按需转换
*/
BeanUtils.setProperty(bean, "name", "张三");
BeanUtils.setProperty(bean, "age", "23");
//如果有多余属性设置则忽略
BeanUtils.setProperty(bean, "xxx", "XXX"); System.out.println(bean);
} //将一个Map和一个JavaBean对应,两者包含相同的属性
@Test
public void fun2() throws Exception{
Map<String,String> map=new HashMap<String, String>();
map.put("name","张三");
map.put("password", "123"); User user=new User();
BeanUtils.populate(user, map); System.out.println(user);
}
//这里是使用再次封装的类进行上述操作
@Test
public void fun3(){
Map<String,String> map=new HashMap<String, String>();
map.put("name","张三");
map.put("password", "123"); User user=CommonUtils.toBean(map, User.class);
System.out.println(user);
} }

BeanUtils使用示例

 import java.util.Map;
import java.util.UUID; import org.apache.commons.beanutils.BeanUtils; public class CommonUtils {
//获取一个32位长的随机大写字串
public static String uuid(){
return UUID.randomUUID().toString().replace("-", "").toUpperCase();
} //将一个Map集合中的数据封装到一个JavaBean中,两者需要一一对应
public static <T> T toBean(Map<String,String> map,Class<T> clazz){
//1、在这里使用try,避免调用者进行重复的错误处理过程
try{
//创建指定类型的JavaBean对象
T bean=clazz.newInstance();
//调用BeanUtils类进行封装操作
BeanUtils.populate(bean, map);
//返回封装好的JavaBean对象
return bean;
}catch(Exception e){
throw new RuntimeException();
}
}
}

CommonUtils源码

javaweb二的更多相关文章

  1. javaweb(二十三)——jsp自定义标签开发入门

    一.自定义标签的作用 自定义标签主要用于移除Jsp页面中的java代码. 二.自定义标签开发和使用 2.1.自定义标签开发步骤 1.编写一个实现Tag接口的Java类(标签处理器类) 1 packag ...

  2. javaweb(二十二)——基于Servlet+JSP+JavaBean开发模式的用户登录注册

    一.Servlet+JSP+JavaBean开发模式(MVC)介绍 Servlet+JSP+JavaBean模式(MVC)适合开发复杂的web应用,在这种模式下,servlet负责处理用户请求,jsp ...

  3. javaweb(二十一)——JavaWeb的两种开发模式

    一.JSP+JavaBean开发模式 1.1.jsp+javabean开发模式架构 jsp+javabean开发模式的架构图如下图(图1-1)所示

  4. JavaWeb(二)——Tomcat服务器(一)

    一.Tomcat服务器端口的配置 Tomcat的所有配置都放在conf文件夹之中,里面的server.xml文件是配置的核心文件. 如果想修改Tomcat服务器的启动端口,则可以在server.xml ...

  5. JavaWeb(二):Servlet

    一.本教程使用的Web容器——Tomcat Tomcat是提供一个支持Servlet和JSP运行的容器.Servlet和JSP能根据实时需要,产生动态网页内容.而对于Web服务器来说, Apache仅 ...

  6. javaweb(二十六)——jsp简单标签标签库开发(二)

    一.JspFragment类介绍 javax.servlet.jsp.tagext.JspFragment类是在JSP2.0中定义的,它的实例对象代表JSP页面中的一段符合JSP语法规范的JSP片段, ...

  7. javaweb(二十四)——jsp传统标签开发

    一.标签技术的API 1.1.标签技术的API类继承关系 二.标签API简单介绍 2.1.JspTag接口 JspTag接口是所有自定义标签的父接口,它是JSP2.0中新定义的一个标记接口,没有任何属 ...

  8. javaweb(二十)——JavaBean总结

    一.什么是JavaBean JavaBean是一个遵循特定写法的Java类,它通常具有如下特点: 这个Java类必须具有一个无参的构造函数 属性必须私有化. 私有化的属性必须通过public类型的方法 ...

  9. JavaWeb 二维码

    说明 相关包 zxing-core3.3 zxing-javase3.3 junit4.12 POM文件 <dependency> <groupId>com.google.zx ...

随机推荐

  1. Visual Studio添加lib到链接依赖项的几种方法

    使用第三方库文件编写应用时经常会出现链接错误: 错误 22 error LNK2019: 无法解析的外部符号..... 该符号在函数.....在....中被引用 出现这个错误的原因很简单,链接器在將库 ...

  2. [ Git ] [ GitHub ] 如何刪除自己github上面的Repository-轉載

    http://www.winwu.cc/2013/03/githubrepository.html

  3. Linux 下段错误 core文件

    什么是core dump? core的意思是内存,dump的意思是扔出来,堆出来:当一个程序奔溃时,在进程当前工作目录的core文件中复制了该进程的存储图像.core文件仅仅是一个内存映像(同时加上调 ...

  4. 《剑指offer》包含min函数的栈

    一.题目描述 定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的min函数. 二.输入描述 输入栈 三.输出描述 最小值 四.牛客网提供的框架 class Solution { public: ...

  5. 《剑指offer》链表中倒数第k个结点

    一.题目描述 输入一个链表,输出该链表中倒数第k个结点. 二.输入描述 一个链表 三.输出描述 链表的倒数第k个结点 四.牛客网提供的框架 /* struct ListNode { int val; ...

  6. hdu 2647 Reward(拓扑排序+优先队列)

    Problem Description Dandelion's uncle is a boss of a factory. As the spring festival is coming , he ...

  7. ReactiveCocoa简单使用20例

    ReactiveCocoa简单使用20例 1. 观察值变化 你别动,你一动我就知道. //当self.value的值变化时调用Block,这是用KVO的机制,RAC封装了KVO @weakify(se ...

  8. 【noip2016】蚯蚓(单调性+队列)

    题目贼长 大意是你有n个线段,每一秒你要拿出来最长的一个线段切成两段长度为[p*u](向下取整)和u-[p*u]两段(其中u是线段长,p是一个大于0小于1的实数)没被切的线段长度加q(0<q&l ...

  9. [React] Pass a function to setState in React

    In React, when you want to set the state which calculation depends on the current state, using an ob ...

  10. 推荐一款优雅的jquery手风琴特效

    推荐一款基于 jQuery和 CSS3实现的手风琴效果. 查看demo演示