除了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. Java调用Python遇到的一系列问题与解决方案

    首先,百度了几个方法 1.用jython里的一个jar包,jython.jar,里面封装了一个专门调用Python的类, 但是不知道为什么我用Java一调用就报错,因此放弃.   2.用runtime ...

  3. IDEA項目配置404

        本人使用的版本是 Intellij IDEA 2017.1 最近刚学习使用 Intellij IDEA 开发项目,就遇到了坑爹的问题,部署一个简单的 ssh 项目,tomcat启动正常,没有任 ...

  4. AIX系统谨慎使用reboot命令

    在客户一次停机维护中,发现了这个问题. 环境是ORACLE 10G RAC for AIX6,使用了HACMP管理共享磁盘. 在停机维护时间段内需要重启主机,当关闭了数据库和CLUSTER后,节点1使 ...

  5. Busy waiting

    In computer systems organization or operating systems, "busy waiting" refers to a process ...

  6. BZOJ 3277/3473 广义后缀自动机

    说实话没啥难的. 建一棵广义后缀自动机,暴力自底向上更新即可. 时间复杂度非常玄学,但据说是可以过的. 要注意每个串中相同的子串的贡献是都要加进去的,开始因为这个被坑了好久 QAQ Code: #in ...

  7. NetHogs---按进程或程序实时统计网络带宽使用率。

    NetHogs是一个开源的命令行工具(类似于Linux的top命令),用来按进程或程序实时统计网络带宽使用率. 来自NetHogs项目网站: NetHogs是一个小型的net top工具,不像大多数工 ...

  8. 如何创建一个可以使用try.....catch.......捕获的异常

    代码很简单,大家一看基本上就能明白(有一定的java基础,熟悉try......catch.....finally的使用方法) package com.nokia.test1; public clas ...

  9. 金融项目java开发_BigDecimal(解决计算精度问题)

    当使用double进行商业运算时,double计算会丢失精度.可以使用BigDecimal进行计算. import java.math.BigDecimal; import org.junit.Tes ...

  10. ListView阻尼效果

    效果图省略.. . activity_main.xml(仅仅有一个自己定义ListView) <RelativeLayout xmlns:android="http://schemas ...