javaweb二
除了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二的更多相关文章
- javaweb(二十三)——jsp自定义标签开发入门
一.自定义标签的作用 自定义标签主要用于移除Jsp页面中的java代码. 二.自定义标签开发和使用 2.1.自定义标签开发步骤 1.编写一个实现Tag接口的Java类(标签处理器类) 1 packag ...
- javaweb(二十二)——基于Servlet+JSP+JavaBean开发模式的用户登录注册
一.Servlet+JSP+JavaBean开发模式(MVC)介绍 Servlet+JSP+JavaBean模式(MVC)适合开发复杂的web应用,在这种模式下,servlet负责处理用户请求,jsp ...
- javaweb(二十一)——JavaWeb的两种开发模式
一.JSP+JavaBean开发模式 1.1.jsp+javabean开发模式架构 jsp+javabean开发模式的架构图如下图(图1-1)所示
- JavaWeb(二)——Tomcat服务器(一)
一.Tomcat服务器端口的配置 Tomcat的所有配置都放在conf文件夹之中,里面的server.xml文件是配置的核心文件. 如果想修改Tomcat服务器的启动端口,则可以在server.xml ...
- JavaWeb(二):Servlet
一.本教程使用的Web容器——Tomcat Tomcat是提供一个支持Servlet和JSP运行的容器.Servlet和JSP能根据实时需要,产生动态网页内容.而对于Web服务器来说, Apache仅 ...
- javaweb(二十六)——jsp简单标签标签库开发(二)
一.JspFragment类介绍 javax.servlet.jsp.tagext.JspFragment类是在JSP2.0中定义的,它的实例对象代表JSP页面中的一段符合JSP语法规范的JSP片段, ...
- javaweb(二十四)——jsp传统标签开发
一.标签技术的API 1.1.标签技术的API类继承关系 二.标签API简单介绍 2.1.JspTag接口 JspTag接口是所有自定义标签的父接口,它是JSP2.0中新定义的一个标记接口,没有任何属 ...
- javaweb(二十)——JavaBean总结
一.什么是JavaBean JavaBean是一个遵循特定写法的Java类,它通常具有如下特点: 这个Java类必须具有一个无参的构造函数 属性必须私有化. 私有化的属性必须通过public类型的方法 ...
- JavaWeb 二维码
说明 相关包 zxing-core3.3 zxing-javase3.3 junit4.12 POM文件 <dependency> <groupId>com.google.zx ...
随机推荐
- PHP万能的连接数据库
<?php class DB{ const HOST='127.0.0.1'; const USER='root'; const PASS='root'; const DATA='mooc'; ...
- Linux启动用户空间-init初始化进程
- NodeJS学习笔记 进阶 (8)express+morgan实现日志记录(ok)
个人总结:这篇文章讲解了Express框架中日志记录插件morgan的示例.读完这篇文章需要10分钟 摘选自网络 章节概览 morgan是express默认的日志中间件,也可以脱离express,作为 ...
- NodeJS学习笔记 (30)定时器-timers
https://github.com/chyingp/nodejs-learning-guide
- 关于thinkphp 命令行
很多人做多年开发只懂得PHP能在浏览器下运行或者只能结合APACHE等WEB服务器运行,却不晓得,PHP也能用命令行执行,或许是由于大多人在WINDOWS平台做开发部署运行,比较少接触LINUX. T ...
- bzoj1025 [SCOI2009]游戏 动态规划
题目描述 对于一些长度为n的排列,将其作为一个置换,那么可能有一个自置换的次数使其回到1,2,3,...,n的情况.求对于所有能够回到1,2,3..,n的排列,不同的次数共有多少种. 题解来自黄学长 ...
- 洛谷 P1209 [USACO1.3]修理牛棚 Barn Repair
P1209 [USACO1.3]修理牛棚 Barn Repair 题目描述 在一个夜黑风高,下着暴风雨的夜晚,farmer John的牛棚的屋顶.门被吹飞了. 好在许多牛正在度假,所以牛棚没有住满. ...
- WIN10远程桌面连接--“出现身份验证错误。要求的函数不支持”
最近WIN10升级补丁后发现远程桌面无法连接了,报“出现身份验证错误.要求的函数不支持”的错误: 解决办法: 第一种,配置本地自己的电脑,开始菜单->搜索gpedit.msc并打开 打开配置 ...
- easyui combobox 设置值 顺序放在最后
easyui combobox 设置值 顺序放在最后 如果设置函数.又设置选中的值,注意顺序, 设置值需要放到最后,否则会设置了之后又没有了: $('#spanId'+i).combobox(res) ...
- PHP 做图片锐化处理
<?php //读取图像的类型 //1=GIF,2=JPG,3=PNG,4=SWF,5=PSD,6=BMP,7=TIFF(intelbyteorder),8=TIFF(motorolabyteo ...