zoukankan      html  css  js  c++  java
  • javaweb二

    除了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      */
    37     public void attributeAdded(ServletContextAttributeEvent event)  { 
    38         System.out.println("您向application中添加了一个名为" + event.getName() + ", 值为:"
    39                 + event.getValue() + "的属性");
    40     }
    41 
    42     //注意重置时,事件对象获取的是被操作的属性键值对(即原来的),同时可以通过域对象获取新的键值对
    43     public void attributeReplaced(ServletContextAttributeEvent event)  { 
    44         System.out.println(event.getName() + "=" + event.getValue() + ", "
    45                 + event.getServletContext().getAttribute(event.getName()));
    46     }
    47     
    48     public void attributeRemoved(ServletContextAttributeEvent event)  { 
    49         System.out.println(event.getName() + "=" + event.getValue());
    50     }
    51     
    52     /*8个监听器还有两个,可称为感知监听器,都与HttpSession有关
    53      * 特点是:1、添加在javabean中而非域中,2、不需在web.xml中配置
    54      * 
    55      * 一个是HttpSessionBindingListener,绑定在一个JavaBean中,可以使其感知是否被session添加/移除
    56      * 另一个是HttpSessionActivationListener,同样绑定在JavaBean中,可以感知是否绑定session并且这个
    57      * session是否钝化或重新活化
    58      */
    59     private String username;
    60     private String password;
    61     public String getUsername() {
    62         return username;
    63     }
    64     public void setUsername(String username) {
    65         this.username = username;
    66     }
    67     public String getPassword() {
    68         return password;
    69     }
    70     public void setPassword(String password) {
    71         this.password = password;
    72     }
    73     
    74     public Dlistener(String username, String password) {
    75         super();
    76         this.username = username;
    77         this.password = password;
    78     }
    79     @Override
    80     public String toString() {
    81         return "User [username=" + username + ", password=" + password + "]";
    82     }
    83     
    84         //下面两个是HttpSessionBindingListener监听器方法,感应该javabean是否被session保存和移除
    85     @Override
    86     public void valueBound(HttpSessionBindingEvent event) {
    87         System.out.println("啊~,session添加了我!");
    88     }
    89     @Override
    90     public void valueUnbound(HttpSessionBindingEvent event) {
    91         System.out.println("哇哇哇~,无情的session抛弃了我!");
    92     }
    93 }
    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源码
  • 相关阅读:
    队列简单题
    排序篇(c++/c实现)
    天河计算机0.5
    BZOJ2301/LG2522 「HAOI2011」Problem B 莫比乌斯反演 数论分块
    BZOJ1391/LG4177 「CEOI2008」order 最大权闭合子图
    BZOJ2007/LG2046 「NOI2010」海拔 平面图最小割转对偶图最短路
    BZOJ1001/LG4001 「ICPC Beijing2006」狼抓兔子 平面图最小割转对偶图最短路
    BZOJ2339/LG3214 「HNOI2011」 卡农 组合数学
    LG1840 Color the Axis 线段树
    LG5239 回望京都 组合数+暴力
  • 原文地址:https://www.cnblogs.com/songfeilong2325/p/4524101.html
Copyright © 2011-2022 走看看