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

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

filter简例

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

  1. import javax.servlet.ServletContextAttributeEvent;
  2. import javax.servlet.ServletContextAttributeListener;
  3. import javax.servlet.ServletContextEvent;
  4. import javax.servlet.ServletContextListener;
  5. import javax.servlet.annotation.WebListener;
  6. import javax.servlet.http.HttpSessionBindingEvent;
  7. import javax.servlet.http.HttpSessionBindingListener;
  8.  
  9. /*listener监听器也是Javaweb三大组件之一,也需要在web.xml中进行配置
  10. * 监听器就是用来对特定事件进行监听,并作出相应的行为,所以监听器都是接口,需要用户自己完成对行为的定义
  11. * Javaweb中有8个监听器,其中有6个对3大域(ServletContext/HttpSession/ServletResquset)进行监听,
  12. * 其中一个监听域的生命周期,一个监听域的属性
  13. * 只要实现相应接口即可完成监听,下面就是对ServletContext生命周期的监听(即对init()和destroy()监听)
  14. */
  15. @WebListener
  16. public class Dlistener implements ServletContextListener, ServletContextAttributeListener,HttpSessionBindingListener{
  17. public Dlistener() {
  18. }
  19.  
  20. /*监听器的另一个重要的方面就是事件对象,这是自动传入的,可以对事件进行分析然后采取不同的处理方式
  21. * 在生命周期监听器中,事件对象的主要方法是获取相应域对象
  22. */
  23. @Override
  24. public void contextDestroyed(ServletContextEvent arg0) {
  25. System.out.println("死亡!");
  26. }
  27.  
  28. @Override
  29. public void contextInitialized(ServletContextEvent arg0) {
  30. System.out.println("出生!");
  31. }
  32.  
  33. /*属性监听器:用于对属性的设置/重置/移除等事件的监听,
  34. * 这种监听器的事件对象可以获取操作的属性的键值对,
  35. */
  36. public void attributeAdded(ServletContextAttributeEvent event) {
  37. System.out.println("您向application中添加了一个名为" + event.getName() + ", 值为:"
  38. + event.getValue() + "的属性");
  39. }
  40.  
  41. //注意重置时,事件对象获取的是被操作的属性键值对(即原来的),同时可以通过域对象获取新的键值对
  42. public void attributeReplaced(ServletContextAttributeEvent event) {
  43. System.out.println(event.getName() + "=" + event.getValue() + ", "
  44. + event.getServletContext().getAttribute(event.getName()));
  45. }
  46.  
  47. public void attributeRemoved(ServletContextAttributeEvent event) {
  48. System.out.println(event.getName() + "=" + event.getValue());
  49. }
  50.  
  51. /*8个监听器还有两个,可称为感知监听器,都与HttpSession有关
  52. * 特点是:1、添加在javabean中而非域中,2、不需在web.xml中配置
  53. *
  54. * 一个是HttpSessionBindingListener,绑定在一个JavaBean中,可以使其感知是否被session添加/移除
  55. * 另一个是HttpSessionActivationListener,同样绑定在JavaBean中,可以感知是否绑定session并且这个
  56. * session是否钝化或重新活化
  57. */
  58. private String username;
  59. private String password;
  60. public String getUsername() {
  61. return username;
  62. }
  63. public void setUsername(String username) {
  64. this.username = username;
  65. }
  66. public String getPassword() {
  67. return password;
  68. }
  69. public void setPassword(String password) {
  70. this.password = password;
  71. }
  72.  
  73. public Dlistener(String username, String password) {
  74. super();
  75. this.username = username;
  76. this.password = password;
  77. }
  78. @Override
  79. public String toString() {
  80. return "User [username=" + username + ", password=" + password + "]";
  81. }
  82.  
  83. //下面两个是HttpSessionBindingListener监听器方法,感应该javabean是否被session保存和移除
  84. @Override
  85. public void valueBound(HttpSessionBindingEvent event) {
  86. System.out.println("啊~,session添加了我!");
  87. }
  88. @Override
  89. public void valueUnbound(HttpSessionBindingEvent event) {
  90. System.out.println("哇哇哇~,无情的session抛弃了我!");
  91. }
  92. }

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中已经默认添加,所以可以直接使用。   

  1. <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
  2. <%--
  3. 这里使用的是JSTL的核心库标签:core,也被称为c标签,前缀通常使用c
  4. --%>
  5. <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
  6. <%--
  7. 这里使用的是JSTL的格式化标签库:fmt
  8. --%>
  9. <%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
  10. <%
  11. String path = request.getContextPath();
  12. String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
  13. %>
  14.  
  15. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
  16. <html>
  17. <head>
  18. <base href="<%=basePath%>">
  19.  
  20. <title>My JSP 'JSTL.jsp' starting page</title>
  21.  
  22. <meta http-equiv="pragma" content="no-cache">
  23. <meta http-equiv="cache-control" content="no-cache">
  24. <meta http-equiv="expires" content="0">
  25. <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
  26. <meta http-equiv="description" content="This is my page">
  27. <!--
  28. <link rel="stylesheet" type="text/css" href="styles.css">
  29. -->
  30.  
  31. </head>
  32.  
  33. <body>
  34. <%--下面三个标签是用于设置/输出/移除域中属性,可以设置指定域,设置时默认对特殊标签进行转义,默认域为page--%>
  35. <c:set var="xxx" value="<script>alter('hello');</script>" scope="page"/>
  36. <c:out value="${xxx}" /><br/>
  37. <c:remove var="xxx" scope="page"/>
  38. <c:out value="${xxx}" default="该值不存在或已被删除"/><br/>
  39.  
  40. <%--下面是两种生成url的方式比较 --%>
  41. ${pageContext.request.contextPath}/Aservlet<br/>
  42. <c:url value="/AServlet">
  43. <c:param name="username" value="张三"></c:param>
  44. </c:url>
  45. <br/>
  46.  
  47. <%--JSTL标签还可以替换判断语句和循环语,
  48. 判断语句分两种:1、单个判断,2、多个判断
  49. --%>
  50. <%--
  51. 注意:判断是否为空时,格式为not empty ***/empty ***
  52. --%>
  53. <c:if test="${not empty xxx}">
  54. hello<br/>
  55. </c:if>
  56. <c:set var="fen" value="60" />
  57. <c:choose>
  58. <c:when test="${fen>100||fen<0}">
  59. 错误的分数<br/>
  60. </c:when>
  61. <c:when test="${fen<60}">
  62. 不及格<br/>
  63. </c:when>
  64. <c:when test="${fen>=60}">
  65. 及格<br/>
  66. </c:when>
  67. </c:choose>
  68. <%--循环有两种,一种是计数循环;一种是遍历循环,用于集合和数组 --%>
  69. <c:forEach var="i" begin="1" end="10" step="2">
  70. ${i}<br/>
  71. </c:forEach>
  72. <%
  73. String[] str={"a","b"};
  74. request.setAttribute("str", str);
  75. %>
  76. <%--!!!注意下面在items属性值的结束"之前不要有多余的空格,否则会出错--%>
  77. <c:forEach items="${requestScope.str}" var="string">
  78. ${string}<br/>
  79. </c:forEach>
  80.  
  81. <%
  82. Date d=new Date();
  83. request.setAttribute("date",d);
  84. %>
  85. <fmt:formatDate value="${date}" pattern="yyyy-MM-dd HH:mm:ss"/>
  86. <br/>
  87. </body>
  88. </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

  1. public class Person {
  2. /*该类就是一个javabean的示例,规范是:
  3. * javaBean的规范:
  4. * 1. 必须要有一个默认构造器
  5. * 2. 提供get/set方法,如果只有get方法,那么这个属性是只读属性!
  6. * 3. 属性:有get/set方法的成员,还可以没有成员,只有get/set方法。属性名称由get/set方法来决定!而不是成员名称!
  7. * 4. 方法名称满足一定的规范,那么它就是属性!boolean类型的属性,它的读方法可以是is开头,也可以是get开头!
  8. *
  9. */
  10. private String username;
  11. private int age;
  12. private String sex;
  13.  
  14. public Person(String username, int age, String sex) {
  15. super();
  16. this.username = username;
  17. this.age = age;
  18. this.sex = sex;
  19. }
  20. public Person() {
  21. super();
  22. }
  23.  
  24. //第三条指的是如下面的情况:get后面使用的name,而成员是username时以get后为准,
  25. public String getName() {
  26. return username;
  27. }
  28. public void setName(String username) {
  29. this.username = username;
  30. }
  31. public int getAge() {
  32. return age;
  33. }
  34. public void setAge(int age) {
  35. this.age = age;
  36. }
  37. public String getSex() {
  38. return sex;
  39. }
  40. public void setSex(String sex) {
  41. this.sex = sex;
  42. }
  43. //一个属性可以只有get/set方法而没有成员
  44. public String getId(){
  45. return "89757";
  46. }
  47.  
  48. @Override
  49. public String toString() {
  50. return "Person [username=" + username + ", age=" + age + ", sex=" + sex + "]";
  51. }
  52.  
  53. }

javabean示例

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

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

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

  1. import java.util.HashMap;
  2. import java.util.Map;
  3.  
  4. import org.apache.commons.beanutils.BeanUtils;
  5. import org.junit.Test;
  6.  
  7. import cn.dqxst.utils.CommonUtils;
  8.  
  9. public class BeanUtilsDemo {
  10. /*在myeclipse中使用junit单元测试,
  11. * 只要在需要测试的前加 @Test ,注意有大小写区别,就会提示导入测试所需的包
  12. */
  13. @Test
  14. public void fun1() throws Exception {
  15. String className="cn.dqxst.domain.Person";
  16. Class<?> clazz=Class.forName(className);
  17. Object bean=clazz.newInstance();
  18. //BeanUtils可以代替繁琐的反省操作,直接对JavaBean操作
  19. /*如果某个属性没有设置不会报错,
  20. * 注意该类对属性值的处理:都会转换为字符串,然后在赋值时按需要进行转换
  21. * 并且在获取属性时,会将其值转换为String类型,可以按需转换
  22. */
  23. BeanUtils.setProperty(bean, "name", "张三");
  24. BeanUtils.setProperty(bean, "age", "23");
  25. //如果有多余属性设置则忽略
  26. BeanUtils.setProperty(bean, "xxx", "XXX");
  27.  
  28. System.out.println(bean);
  29. }
  30.  
  31. //将一个Map和一个JavaBean对应,两者包含相同的属性
  32. @Test
  33. public void fun2() throws Exception{
  34. Map<String,String> map=new HashMap<String, String>();
  35. map.put("name","张三");
  36. map.put("password", "123");
  37.  
  38. User user=new User();
  39. BeanUtils.populate(user, map);
  40.  
  41. System.out.println(user);
  42. }
  43. //这里是使用再次封装的类进行上述操作
  44. @Test
  45. public void fun3(){
  46. Map<String,String> map=new HashMap<String, String>();
  47. map.put("name","张三");
  48. map.put("password", "123");
  49.  
  50. User user=CommonUtils.toBean(map, User.class);
  51. System.out.println(user);
  52. }
  53.  
  54. }

BeanUtils使用示例

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

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. PHP万能的连接数据库

    <?php class DB{ const HOST='127.0.0.1'; const USER='root'; const PASS='root'; const DATA='mooc'; ...

  2. Linux启动用户空间-init初始化进程

  3. NodeJS学习笔记 进阶 (8)express+morgan实现日志记录(ok)

    个人总结:这篇文章讲解了Express框架中日志记录插件morgan的示例.读完这篇文章需要10分钟 摘选自网络 章节概览 morgan是express默认的日志中间件,也可以脱离express,作为 ...

  4. NodeJS学习笔记 (30)定时器-timers

    https://github.com/chyingp/nodejs-learning-guide

  5. 关于thinkphp 命令行

    很多人做多年开发只懂得PHP能在浏览器下运行或者只能结合APACHE等WEB服务器运行,却不晓得,PHP也能用命令行执行,或许是由于大多人在WINDOWS平台做开发部署运行,比较少接触LINUX. T ...

  6. bzoj1025 [SCOI2009]游戏 动态规划

    题目描述 对于一些长度为n的排列,将其作为一个置换,那么可能有一个自置换的次数使其回到1,2,3,...,n的情况.求对于所有能够回到1,2,3..,n的排列,不同的次数共有多少种. 题解来自黄学长 ...

  7. 洛谷 P1209 [USACO1.3]修理牛棚 Barn Repair

    P1209 [USACO1.3]修理牛棚 Barn Repair 题目描述 在一个夜黑风高,下着暴风雨的夜晚,farmer John的牛棚的屋顶.门被吹飞了. 好在许多牛正在度假,所以牛棚没有住满. ...

  8. WIN10远程桌面连接--“出现身份验证错误。要求的函数不支持”

    最近WIN10升级补丁后发现远程桌面无法连接了,报“出现身份验证错误.要求的函数不支持”的错误: 解决办法: 第一种,配置本地自己的电脑,开始菜单->搜索gpedit.msc并打开   打开配置 ...

  9. easyui combobox 设置值 顺序放在最后

    easyui combobox 设置值 顺序放在最后 如果设置函数.又设置选中的值,注意顺序, 设置值需要放到最后,否则会设置了之后又没有了: $('#spanId'+i).combobox(res) ...

  10. PHP 做图片锐化处理

    <?php //读取图像的类型 //1=GIF,2=JPG,3=PNG,4=SWF,5=PSD,6=BMP,7=TIFF(intelbyteorder),8=TIFF(motorolabyteo ...