JavaWeb(李兴华著)开发笔记

1.Java语法-基础

环境变量-JAVA_HOME, PATH, ClassPath

 

变量名

作用

举例

JAVA_HOME

指向JDK目录

C:\Program Files\Java\jdk1.7.0_21

PATH

指向java.exe目录。

 

%JAVA_HOME%\bin;

%JAVA_HOME%\jre\bin

CLASSPATH

执行.jar文件、zip文件、.class文件所在目录。

(程序要用到哪些.class文件,)

%JAVA_HOME%\lib\dt.jar;

 %JAVA_HOME%\lib\tools.jar;

 

 

 

 

 

控制语句  99 bottles of beer

 

public class GoJava2 {

 

   /**

    * @param args

    */

   public static void main(String[] args) {

 

       int beerNum=99;

       String word="bottles";

       while(beerNum>1){

          System.out.println(beerNum+" "+word+" of beer on the wall");

          System.out.println(beerNum+" "+word+" of beer");

          System.out.println("Take one down");

          System.out.println("pass it around");

          beerNum--;

       }

       if(beerNum==1){

          System.out.println(beerNum+" bottle of beer on the wall");

          System.out.println("Take one down, no more beers");

       }

   }

}

 


guessNumber 游戏

 

 

public class Player {

    int number;

    public int Guess(){

        this.number=(int)(Math.random()*10);

        return this.number;

    }

   

 

    /**

     * @param args

     */

    public static void main(String[] args) {

        // TODO Auto-generated method stub

        Player p1=new Player();

        Player p2=new Player();

        Player p3=new Player();

       

 

        boolean continueFlag=true;

        int answer=-1;

        while(continueFlag){

            answer=(int)(Math.random()*10);

            int n1=p1.Guess();

            int n2=p2.Guess();

            int n3=p3.Guess();

           

            System.out.println("answer is:"+answer);

            System.out.println("player1 guesses:"+n1);

            System.out.println("player2 guesses:"+n2);

            System.out.println("player3 guesses:"+n3);

         

            if(n1==answer||n2==answer||n3==answer){

                System.out.println("we have a winner among the p1,p2,p3");

                continueFlag=false;

            }

            else{System.out.println("no one guessed the answer,game continue");}

        }

        System.out.println("p1 guesses:"+(p1.number==answer));

        System.out.println("p2 guesses:"+(p2.number==answer));

        System.out.println("p2 guesses:"+(p3.number==answer));

    }

 

}

 

 

引用变量  遥控 对象

 

public class Dog {

    String name;

    public void bark(){

        System.out.println(this.name+" is barking");

    }

    /**

     * @param args

     */

    public static void main(String[] args) {

         Dog[] dogs=new Dog[3];

         dogs[2]=new Dog();

         dogs[0]=new Dog();

         dogs[0].name="Fido";

         dogs[2]=dogs[0];

         dogs[2].bark();

         if(dogs[2].name==dogs[0].name){

         System.out.println(true);

         }

         else{

         System.out.println(false);

         }

    }

 

}

输出:

Fido is barking

true

 

 

 

 

 

 

 

super()

 


final

作用:修饰变量

效果:赋值之后 无法改变。

.java文件中放多个类

 规则:

       最多只能有一个public Class.                                                

如果存在public Class,那么 .java的文件名必须是public Class的名字

 

 

 

.java-.class-.jar 文件

摘要

类型

说明

.java

写代码写在这文件中

.jar

本质:多个.class文件的压缩包。

如何生成:(1)IDE中Export JAR我那件

          (2)winzip将class文件压缩成.jar

.class文件

本质:在java虚拟机中运行的二进制文件

----

如何生成:

 step1:进入到.java文件的目录

   f:

   cd pkgSvt

 

step2:javac  java文件名

效果:相同位置产生.class文件

 

如何运行.class文件

step1  java –cp f:\pkgSvt ClsStrSB //设置classpath,要用哪些class

step2  cd pkgSvt        //进入父目录

step3  java ClsStrSB   //执行class 中的 main

 

 

 

Object  为空判断

判断对象为null

 If(obj==null){//为空

}

eclipse导出jar, classpath not found

工程文件夹应该会有个大红感叹号。右击工程文件夹,properties 选择java build class,查看各选项卡,有红色错误提醒的remove之即可。


数组- List -ArrayList

 

数组

摘要:直接声明。

      指定长度声明。

      不可动态改变长度。

String[] IDNUMs={"US100","US120"};

String[] temp=new String[10];

 

数组随机 专家术语机.

Index:Math.random,  String[] ={},

数组定义:

String[]  array1={“”,””,””}

 

 

public static void main(String[] args) {

 

      String[] wordListOne = {"24/7","multi-Tier","30,000 foot","B-to-B","win-win","frontend","web-based","pervasive", "smart", "sixsigma","critical-path", "dynamic"};

      String[] wordListTow={"process","tipping-point","solution","archetecture","core-competency","strategy","mind-care"};

      String[] wordListThree={"toomcat","apache","Linux","nginx"};

     

      String word1=wordListOne[(int)(Math.random()*wordListOne.length)];

      String word2=wordListTow[(int)(Math.random()*wordListTow.length)];

      String word3=wordListThree[(int)(Math.random()*wordListThree.length)];

     

      for(int i=0;i<=9;i++){

         System.out.println(word1+" "+word2+" "+word3);

      }

   }

 

输出:

web-based core-competency apache

web-based core-competency apache

web-based core-competency apache

web-based core-competency apache

web-based core-competency apache

web-based core-competency apache

web-based core-competency apache

web-based core-competency apache

web-based core-competency apache

web-based core-competency apache

 

List

List([]内的内容可省略),与数组类似:

      ArrayList liPts=new ArrayList();

      while(rs.next()){

         DisPoint pt=new DisPoint(rs.getInt("ID"),rs.getString("Name"),rs.getDouble("Longitude"),rs.getDouble("Latitude"));        

         liPts.add(pt);

              }
 

获得集合内元素个数:list.size();

添加元素:
默认添加:list.add(e);
指定下标添加(添加后下标后的元素向后挪一位):list.add(index,e);

删除元素:
返回是否删除:list.remove(e);
直接删除指定下标的元素(只删除找到的第一个相符合的元素):list.remove(index);

替换元素(替换掉指定下标的元素):list.set(index,e);

取出元素:list.get(index);

清空集合:list.clear();

判断集合中是否存在某个元素(存在返回true,不存在返回false):list.contains(e);

对比两个集合中的所有元素:
两个对象一定相等:list.equals(list2);
两个对象不一定相等:list.hashCode() == list2.hashCode();
(两个相等对象的equals方法一定为true, 但两个hashcode相等的对象不一定是相等的对象。)

获得元素下标:
元素存在则返回找到的第一个元素的下标,不存在则返回-1:list.indexOf(e);
元素存在则返回找到的最后一个元素的下标,不存在则返回-1:list.lastIndexOf(e);

判断集合是否为空(空则返回true,非空则返回false):list.isEmpty();

返回Iterator集合对象:list.iterator();

将集合转换为字符串:list.toString();

截取集合(从fromIndex开始在toIndex前结束,[fromIndex,toIndex)):list.subList(fromIndex,toIndex);

将集合转换为数组:
默认类型:list.toArray();
指定类型(objects为指定类型的数组对象,并将转换好的数组赋值给objects数组):list.toArray(objects);

以上为List常用的方法。

 

 

 

 

ArrayList

int数组

ArrayList arID=new ArrayList();

 

ArrayList转Array

   public static Integer[] getUtfAr(String usr,int del){  

      ArrayList ar=new ArrayList();     

      for(int i=0;i<=usr.length()-1;i++){

         ar.add(usr.codePointAt(i));         

      }    

      Integer[] tm=(Integer[])ar.toArray(new Integer[ar.size()]);

      return tm;

   }

  

 

 

2.SVN操作

目标:集成到eclipse, 源代码管理

1.下载 svn.jar包

2.解压到 得到两个目录:

        features,plugins

3.将features,plugins拷贝到ecplise/dropins目录下

4.启动eclipse,创建一个workSpace, 例如fareWeb

5.FileàNewàOtheràsvnà从svn检出项目

6.输入url

https://10.254.53.4:8443/svn/bii2ITA/trunk/src/SourceCode/fareWeb

 

用户名:gaoxk

密码:gaoxk123

 

3. 测试-调试

在java classc测试- main函数

  public static void main(String[] args) {

      Crud crud=new Crud();   

      Employee emp=new Employee("孔卡",26,"足球运动员");

      Employee inserted=crud.insertOne(emp);

      crud.printOne(inserted);   

     

      inserted.Name="穆里奇";

      Employee updated=crud.updateOne(inserted);

      crud.printOne(updated);

     

      crud.showAll();

      crud.deleteRecs(updated.id);   

}

 

 

查看方法执行时间

       System.out.println("getCond时间:"+((new Date()).getTime()-now.getTime()));

 

System.out.println 调试

 描述:控制台输出

 参数:string

举例

 System.out.println(“hello world”)

如何查看变量的值

1>    进入Debug View

2>    Window àShow View Expressions

3>    在Name中添加变量名/.变量值,Value中查看值

 

如何查看类型的所有方法/属性  (API Documentation)

1>    鼠标放到类型上,按F2, Open Javadoc in Browser

 

获取离线JavaSE Documentation

1>    网页版

  访问Oracle.com, JavaSE 下载页面,页面靠下的部分有 Java SE Documentation下载,是一个网站(Zip包)

 

2.>Chm版

 在baidu上搜 Java SE API Chm。

 

使用正则查找/替换

需求:

在 edit.html中 ,draw***();替换成空

 

 

譬如:

drawPeoples(); drawGender();

 

正则表达式

draw[a-zA-Z]+\(\);

 

 

 

 

Tomcat

目录结构

 

序号

目录名

描述

1

bin

可运行程序目录。start,shutdown在此目录下。

2

lib

放jar包

3

conf

放配置文件

4

logs

存放日志文件

5

webapps

web项目(war包)在此即发布

6

work

临时目录,jsp生成 .java文件将在此

 

 

端口号设置

http端口

conf/server.xml

 

               connectionTimeout="20000"

               redirectPort="8443" />

 

SSL端口

               maxThreads="150" scheme="https" secure="true"

               clientAuth="false" sslProtocol="TLS" />

-->

 

AJP端口

 


role和用户配置 tomcat-users.xml 

用途:管理用户

      (设置某个web的jsp权限)

  字段:

    

 

举例:

打开conf/tomcat-users.xml

添加两个role,两个 user

 

 

 

 

创建虚拟目录

 原则:每一个虚拟目录存放一个Web项目

 

步骤

序号

详细

概要

1

在硬盘上建立目录,并在目录中建立WEB-INF目录

创建虚拟目录

2

将tomcat/webapps/Root/web.xml拷贝到WEB-INF目录下

添加配置文件web.xml

3

......

......

 

将虚拟目录关联到conf/server.xml

4

在test1下写 index.jsp:

 

<% out.println("Hello,JSP World");%>

 

启动tomcat,访问地址

localhost/test1/

测试

 

 

 

第一个JSP

在已关联的虚拟目录下创建index.jsp,内容如下:

 

<% out.println("Hello,JSP World");%>

 

效果:

 

 

 

 


 

 

 

 

 

虚拟目录/WEB-INF/web.xml

web.xml中的路径符号

 

url-pattern

说明

实际地址

su

无法启动

 

../su

不允许../ 服务器无法启动

 

/su

虚拟目录/su

http://localhost/UI05/su

 

页面form 的路径

sample1.htm

 

pattern

说明

实际地址

"su"

与页面同级的su

http://localhost/UI05/su

"../su"

页面父目录的su

http://localhost /su

 

 

 

Web标准目录结构

 

 

 

WEB-INF必须存在

要点:

  (1)虚拟目录下必须存在WEB-INF目录。 WEB-INF必须包好web.xml文件。

  (2)by default, internet用户无权限访问WEB-INF下的内容。

  (3)不想被浏览器直接访问的页面,放在WEB-INF下。增强安全

web.xml  jsp映射

摘要:

      

 

jsp映射

 

    serA

       /test.jsp

 

 

    serA

       /hello

 

 

web.xml servlet映射

servlet映射

摘要:

      

 

摘要:使用通配符 *

SvtHello

pkgResiCrud.SvtHello

SvtHello

/hello/*

 

init-param配置 驱动-dburl-用户名-密码

在web.xml中

注意:

(1)要放在servlet标签下

   (2)客户端请求url-pattern时,getInitParameter生效。

           客户端直接请求jsp时, getInitParameter取值为null.

     

      

              DbDriver

              oracle.jdbc.driver.OracleDriver

      

serA   

/test.jsp

 

 

    serA

       /hello

 

在JSP页面中:

  以config.getInitParameter(“”)获取参数值

 


 

设置出错处理页面

 

 

       404

       error.jsp

       500

       error.jsp

 

 

效果:

index.jsp

<%@ page language="Java" contentType="text/html;charset=GBK"%>

index.jsp

<%int result=10/0;%>

 

服务端跳转:

 

 

 

error.jsp

 

<%@ page language="Java" contentType="text/html;charset=GBK"%>

页面发生了错误...

点击此处返回主页面

 

备注:with web.xml,即使没有<%@ page isErrorPage=”true”%>,it still works

 


security-contraint页面权限  

备注:GET和Post Request都要求验证

前件:要在tomcat-users.xml中 添加role,和role类的用户

效果:访问页面需要输入用户名密码

用途:保护管理员页面

 

密码传输方式:不是明文

 

 

配置方式:

<security-constraint>

                    

              /check.jsp

      

      

              admin

      

 

  <login-config>

       BASIC      

 

  <security-role>

       admin

 

 

 

 

JSP

第一个JSP

<%@ page language=”Java” contentType=”text/html;charset=utf-8”%>

<%out.println("hello world");%>

 

访问:

http://localhost:8080/UI05/html/first.jsp

 

效果:

...

 

结论:

(1)jsp文件,可以不写

JSP本质是 java类

JSP文件最终都是以.java文件在服务端执行

 

后果:

 (1)第一次访问.jsp比第二次之后慢

 (2)访问后在硬盘上生成.java文件

 

 

 

 

第一个交互表单

在虚拟目录下创建 index.jsp和index.html

 

 

index.html:

 

 

index.jsp:

<% out.println(request.getParameter("info"));%>

 

访问:index.html

 

点击提交:

 

 


基础语法

注释符号

序号

举例

1

<%-- out.println(“hello world”);--%>

2

<% //out.println(“hello world”);%>

3

<% /*out.println(“hello world”);*/ %>

 

java语句标签

作用:java语句要写在 java语句标签内。

备注:不要将指令写在语句标签内

序号

举例

说明

1

<%!public String HelloWorld(){

     return “hello world”;

}%>

作用:

定义 类,方法,全局变量。

(备注:

不要在JSP中定义方法,类。

在JavaClass中定义。)

2

<% String one=”hello world”;

  out.println(one);

%>

执行语句。

3

<%=one%>

获取变量。

(备注:

  不要在<%=%>中添加注释)

4

 

 

 

举例:

<%!public String helloWorld(){

       return "hello world";

};//定义方法%>

<%String one="one";//定义变量%>

<%=helloWorld()%>

<%=one%><%//取变量%>

 


out.print vs <%=%>

<%=%> 称作 表达式输出。

 

结论:

 使用<%=%> 取代<%out.println()%>

好处(1)效率高

(2)html代码和 java代码分离

 


if else写法

正确:

<%if(info.equals("true")){%>

             

               

                

   <%}else{%>

 

 

错误:

 

<%if(info.equals("true")){%>

             

               

                

   <%}%>

 

<%else{%>

 

 

 

 

Page指令索引

 

常用的4种:

 contentType , pageEncoding, errorPage ,import,


Page import指令

导入Jar包

 

 

备注:1个page指令 只能由1个import,1个import只能导1个jar

<%@ page contentType="text/html;" pageEncoding="GBK" import="java.util.*"%>

<%@ page import="java.io.*"%> <%// one page Dir can only import one jar%>

<%@ page import="java.math.*"%>

 

Page pageEncoding=”GBK” 显示中文

 

<%@ page language="Java" contentType="text/html;" pageEncoding="GBK"%><%//jsp要显示中文%>

序号名称描述

 

 

 

 

Page指令contentType 显示html

contentType=”mimeType;”

 

举例

Mime类型

contentType=”text/html;”

text/html

 

<%@ Page language="Java" contentType="text/html; "%>

 

 

 

Page contentType vs response.setHeader控制编码

 

Page设置 Content-Type 正常

 

<%@ page language="Java" contentType="text/html;" pageEncoding=”GBK”%>

序号名称描述

 

 

 

setHeader-ContentType乱码

<%@ page language="Java"%>

<%response.setHeader("Content-Type","text/html;charset=GBK");%>

序号名称描述

 

 

结论:

 JSP页面编码,使用Page指令,不用response.setHeader

 


 

 

 

Page指令 设置出错页

 

show.jsp:

<%@ page language="Java" contentType="text/html;charset=GBK"%>

<%@ page language="Java" errorPage="error.jsp"%>

index.jsp

<%int result=10/0;%>

 

error.jsp

<%@ page language="Java" contentType="text/html;charset=GBK"%>

<%@ page isErrorPage="true"%><%//此页可处理错误%>

页面发生了错误...

点击此处返回主页面

 

效果:

 

 

特点:

  服务端跳转(客户端只发送了一次请求。服务端执行了另一个页面的代码)

 

 

 

 


Include指令 包含jsp,htm文件

原理:所有file被included into index.jsp,再编译

应用:

 

index.jsp:

<%@ page language="Java" contentType="text/html;charset=GBK"%>

<%@include file="left.htm"%>

<%@include file="middle.htm"%>

<%@include file="right.htm"%>

 

left.htm

We

 

middle.htm

are cellestial

 

 

right.htm

man

 

 

效果:

 


jsp:include指令 动态包含

区别:各部分被分别编译,然后包含

 

 

 

 

 

 

jsp:forward指令 跳转

 

 

 


jsp实现登录功能

 

login.htm

      

             

             

             

             

      

登录系统
用户名:
密码:

 

 

 

 

login_check.jsp

<%@ page language="Java" contentType="text/html;charset=GBK"%>

<%@ page import="java.sql.*"%>

<%

     final String DbDriver="oracle.jdbc.driver.OracleDriver";

     final String DbUrl="jdbc:oracle:thin:@localhost:1521:orcl";

     final String Usr="test";

     final String Psw="test";

  

   String paraU=request.getParameter("usr");

   String paraP=request.getParameter("psw");

  

   Class.forName(DbDriver);

   Connection conn=DriverManager.getConnection(DbUrl,Usr,Psw);

   Statement stmt=conn.createStatement();

   String sqlStr="select usr, psw from account";

   String info="false";

   ResultSet rs=stmt.executeQuery(sqlStr);

   while (rs.next()){

        if(rs.getString("usr").equals(paraU)){

           if(rs.getString("psw").equals(paraP)){

                info="true";

              }

              else{

                info="invalid password";

           }

        }

        else{

          continue;

        }

   }

   info=info.equals("false")?"user does not exist":info;

  

   rs.close();

   stmt.close();

   conn.close();   

   %>

<%if(info.equals("true")){%>

             

               

                

   <%}else{%>

             

                    

             

   <%}%>

 

 

 

success.jsp

<%@ page contentType="text/html;charset=GBK"%>

You're Welcome,<%=request.getParameter("info")%>

 

 

 


fail.jsp

<%@ page language="Java" contentType="text/html;charset=GBK"%>

登录失败...<%=request.getParameter("info")%>

返回登录页

 

效果

 

 

 

 

 


服务端跳转 和 客户端跳转

 

 

代码

浏览器效果

服务端跳转

地址栏未改变

客户端跳转

/>

地址栏变化

效率:服务端跳转高

 

 

 

 


JSP 内置对象索引

 

 

常用5个:request, response, pageContext, session, application

 

作用范围 request , session, application

 

 


page 范围

用途:

       jsp页面内存取变量

 

范围:

在当前jsp页面中有效

 

失效情况(any)

 

 


 

request 范围

 

特点:

       比page略长,服务器端跳转后 依然有效;

                客户端跳转后,无效

举例-服务端跳转,有效

 

request_01.jsp

 

 

 

 

request_02.jsp

 

 

 

request-客户端跳转

requst_01.jsp

 

 

 

 


session 范围

特点:session.setAttribute(“info”,”Juptor Mind”)执行

      如果不关闭浏览器,则Webapp下其它页面都可取

 

  无法取得:

        浏览器关闭后

 

举例:

session_01.jsp

 

 

 

session_02.jsp

 

 

 

application 范围

特点:存在服务器上。所有session都可存取

中止:服务器重启

 

举例:

 application_1.jsp

 

 

application_2.jsp

 

 

 

 


request 范围实验(DIY)

 

req1.jsp

<%@ page language="java" contentType="text/html;charset=GBK"%>

Req1.jsp

<%request.setAttribute("info","Jupitor mind");%>

request.getAttribute("info")=<%=request.getAttribute("info")%>

anchor to req2.jsp
<%//prove 客户端跳转%>

<%//prove 服务端跳转.进行 服务端跳转,请去除此语句%>

 

req2.jsp

<%@ page language="Java" contentType="text/html;charset=GBK"%>

req2.jsp

request.getAttribute("info") is:<%=request.getAttribute("info")%>

 

session范围实验(DIY)

 

req1.jsp

<%@ page language="java" contentType="text/html;charset=GBK"%>

Req1.jsp

<%session.setAttribute("info","Jupitor mind");%>

session.getAttribute("info") is:<%=session.getAttribute("info")%>

click to req2.jsp

 

req2.jsp

<%@ page language="Java" contentType="text/html;charset=GBK"%>

req2.jsp

session.getAttribute("info") is:<%=session.getAttribute("info")%>

 


 

HttpServletRequest对象

备注:

 JSP页面和Servlet中的request都是HttpServletRequest类型。

 

 

 

 

setCharacterEncoding 解析中文

应用:客户端发送未编码的中字,先使用此方法,否则乱码

 

实验

check.jsp

<%@ page language="Java" contentType="text/html;" pageEncoding="GBK"%><%//jsp要显示中文%>

<%

       request.setCharacterEncoding("GBK"); //解析中文字符串

       String usr=request.getParameter("usr");

%>

usr:<%=usr%>

 

login.htm

 

   

      

             

      

用户名:

 

getParameter(name) 取一个value

 

 


getParameterValues(name) 获取同name标签values

背景:任何两个html标签允许同名。

login.htm

 

   

             

             

                    

                  

             

             

      

姓名

             

             

             

爱好

                            游泳

                            篮球

                            神风

                    

 


 

check.jsp

<%@ page language="Java" contentType="text/html;" pageEncoding="GBK"%><%//jsp要显示中文%>

<%

       request.setCharacterEncoding("GBK"); //解析中文字符串

       String[] names=request.getParameterValues("name");

       String[] inters=request.getParameterValues("inter");

%>

<%

if(names!=null){

for(int i=0;i<=names.length-1;i++){%>

   name[<%=i%>]:<%=names[i]%>

<%}}%>

<%if(inters!=null){

for(int i=0;i<=inters.length-1;i++){

%>

interest[<%=i%>]:<%=inters[i]%>

<%}}%>

 

getParameterNames取所有name

用途:获取所有传入参数

举例:获取复选框项

适用于:存在复选框时

拓展:查询条件组合,购物车

 

login.html

 

   

             

             

          

             

                    

                  

             

             

      

姓名

                                

             

邮箱

                                  

             

爱好

                            游泳

                            篮球

                            神风

                    

 

check.jsp

<%@ page language="Java" contentType="text/html;" pageEncoding="GBK"%><%//jsp要显示中文%>

<%@ page import="java.util.*"%>

<%

       request.setCharacterEncoding("GBK"); //解析中文字符串

       Enumeration pNames=request.getParameterNames();    //取所有names

       while(pNames.hasMoreElements()){//遍历names

              String pName=(String)pNames.nextElement();

       %>

      

               参数名:<%=pName%>,参数值:<%String[] values=request.getParameterValues(pName);//retrive values of one Name

                     for(int i=0;i<=values.length-1;i++){%>

                            <%=values[i]%> 

                     <%}

               %>

              <%}%>

效果:

 

 

 

 

 

 


Header Cookie, agent, IP , referer,method

举例:遍历request头信息

 

<%@ page language="Java" contentType="text/html" pageEncoding="GBK" import="java.util.*"%>

<%

   Enumeration items=request.getHeaderNames();

   %>

   method:<%=request.getMethod()%>

   clientIP:<%=request.getRemoteAddr()%>

   <%while(items.hasMoreElements()){

        String hName=(String)items.nextElement();

        String value=(String) request.getHeader(hName);             

        %>

        <%=hName%>:<%=value%>

   <%}%>

 

clientIP:127.0.0.1
host:localhost
connection:keep-alive
content-length:80
cache-control:max-age=0
accept:text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
origin:http://localhost
user-agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.72 Safari/537.36
content-type:application/x-www-form-urlencoded
referer:http://localhost/test1/login.htm
accept-encoding:gzip,deflate,sdch
accept-language:zh-CN,zh;q=0.8
cookie:JSESSIONID=816945B50F0C1130B0E00C99B90F731C

 

判断role类型

前提:

(1)在tomcat-users.xml中添加了role和user

(2)在虚拟目录-web.xml中配置security-constraint,login-config,security-role

 

效果:

 login验证通过后,retrive用户role.(不是username)

 

<%@ page language="Java" contentType="text/html" pageEncoding="GBK"%>

<%if(request.isUserInRole("admin")){%>

 Welcome,Role admin

<%}%>

 

getContextPath() 获取应用名

<%@ page language="Java" contentType="text/html;" pageEncoding="GBK"%>

host:<%=request.getHeader("host")%>

ContextPath:<%=request.getContextPath()%>

ServletPath:<%=request.getServletPath()%>

 

 

getServletPath() 取应用名之后部分

 


getCoockies()  Cookies[]

 

 

 

 

HttpServletReponse对象

备注:JSP页面和Servlet中的request都是HttpServletRequest类型。

 

 

setHeader(“refresh”) 定时跳转

摘要:setHeader(“refresh”,”3;url=login.htm”)

备注:客户端跳转

 

<%@ page language="Java" contentType="text/html;" pageEncoding="GBK"%>

<%response.setHeader("refresh","3;url=login.htm");%><%//setHeader("refresh","2;url="),客户端跳转%>

3秒钟后将跳转到login.htm...

sendRedirect  客户端跳转

 

备注:客户端跳转

<%@ page language="Java" contentType="text/html;" pageEncoding="GBK"%>

<%response.sendRedirect("login.htm");%>

 

response.setHeader 保存word

 

页面:

<%@ page language="Java" pageEncoding="GBK"%>

<%response.setHeader("Content-Disposition","attachment;filename=test.doc");%>

序号名称描述

 

Mime设置:

打开conf/web.xml,

确认一下mime-mapping存在

 

        dot

        application/msword

 

效果:页面不打开,直接下载

 

byte[]返回文件 (下载)

 

InputStream inStream=null;         

                     //全部             

                                   try {

                                             inStream=ResiCrud.createExcel(filePath);

                                      } catch (ClassNotFoundException | WriteException

                                                    | SQLException e) {

                                             // TODO Auto-generated catch block

                                             e.printStackTrace();

                                      }                            

                                

                                                                               

                                   response.reset();

                                   response.setHeader("Content-Disposition", "attachment;filename=" +response.encodeURL(fileUrl));                                                   

                                   response.setContentType("application/octet-stream");

                                 

                                   byte[] fileBytes=new byte[1024];                          

                                   int length=0;

                                   while((length=inStream.read(fileBytes))>0){

                                          response.getOutputStream().write(fileBytes,0,length);

                                   }                                                                                                                                                                      

                                   response.flushBuffer();                               

                                   response.getOutputStream().close();

                                   inStream.close(); 

                                   return;     


response返回文本数据

(1)   response.getOutputStream.write二进制流

//设置 数据编码

      response.setHeader("Content-type", "text/plain;charset=utf-8");    

      String result="hello World";

      //传送 二进制数组,将字符串以 utf-8变成 二进制数组

      response.getOutputStream().write(result.getBytes("utf-8"));

 

(2)response.getWriter.write() 字符串

    response.setHeader("Content-type","text/html;charset=UTF-8");

    PrintWriter writer = response.getWriter();

    writer.write("中国");

 

 

Cookie对象

 

意义:Cookie生存在客户端上。常用于存放用户名密码等信息。

在周期满后,会被清除。浏览器执行清空Cookie操作后,也被清除。

个数限制:最多300个

 

Cookie 索引

命名空间:javax.Servlet.http.Cookie

 

 

response.addCookie 添加Cookie

模拟登录,Cookie遍历,添加,

 

 

摘要:

      

取所有Cookies

Cookie[] cos=request.getCookies();

遍历Cookies

for(int i=0;i<=cos.length-1;i++){

   String coName=cos[i].getName();

   String coVal=cos[i].getValue();

}

设置Cookies时长

coName.setMaxAge(600);//十分钟

客户端 延时跳转

response.setHeader(“refresh”,”3;url=login.jsp”)

客户端 立即跳转

reponse.sendRedirect(“login.jsp”)

 

 

 

login.jsp

<%@ page language="Java" pageEncoding="GBK" contentType="text/html"%>

<%

       Cookie[] cos=request.getCookies();

       String usr=null;

       String psw=null;

%>

       <%if(cos!=null){

              for(int i=0;i<=cos.length-1;i++){

                     if(cos[i].getName().equals("usr")){

                            usr=cos[i].getValue();

                     }

                     if(cos[i].getName().equals("psw")){

                            psw=cos[i].getValue();

                     }

              }

              if(usr!=null&&psw!=null){%>

                     <%--服务端跳转--%>

              <%}%>

       <%}%>

 

   

             

             

             

             

      

登录系统
用户名
密码

 

 

check.jsp

<%@ page language="Java" contentType="text/html;" pageEncoding="GBK"%>

<%

       String usr=request.getParameter("usr");

       String psw=request.getParameter("psw");

       String info="用户名不存在";

       if(usr.equals("test")){

              if(psw.equals("test")){

                     info="true";

              }

              else{info="密码无效";}

       }    

%>

<%

       if(info=="true"){

              Cookie cName=new Cookie("usr",usr);

              Cookie cPsw=new Cookie("psw",psw);

              response.addCookie(cName);

              response.addCookie(cPsw);

              response.sendRedirect("index.jsp");

       }

       else{%>

              <%=info%>,请重新登录

       <%}%>

 

index.jsp

<%@ page language="Java" contentType="text/html;" pageEncoding="GBK"%>

<%

  Cookie[] cos=request.getCookies();//取所有Cookie

  String usr=null;

  String psw=null;

  for(int i=0;i<=cos.length-1;i++){

       if(cos[i].getName().equals("usr")){//取用户名Cookie

              usr=cos[i].getValue();

       }

       %>

       CookieName:<%=cos[i].getName()%>,Value:<%=cos[i].getValue()%>

       <%}%>

  <%if(usr!=null){%>

   欢迎你,<%=usr%>

  <%}else{%>

  请先登录,点此前往登录页

  <%}%>

 

Cookie.setMaxAge 存在时间

背景:

不设置Cookie时间,则浏览器关闭后,Cookie被清空。

co.setMaxAge(600) ,Cookie存在10分钟

 

check.jsp

 

<%@ page language="Java" contentType="text/html;" pageEncoding="GBK"%>

<%

       String usr=request.getParameter("usr");

       String psw=request.getParameter("psw");

       String info="用户名不存在";

       if(usr.equals("test")){

              if(psw.equals("test")){

                     info="true";

              }

              else{info="密码无效";}

       }    

%>

<%

       if(info=="true"){

              Cookie cName=new Cookie("usr",usr);

              cName.setMaxAge(600);

              Cookie cPsw=new Cookie("psw",psw);

              cPsw.setMaxAge(600);

              response.addCookie(cName);

              response.addCookie(cPsw);

              response.sendRedirect("index.jsp");

       }

       else{%>

              <%=info%>,请重新登录

       <%}%>

 

 

 

Session对象

应用:用户登录-注销

生存周期:浏览器关闭。

为啥发明session:

  客户端访问服务器,服务器产生唯一的SessionID,用于 标记一次访问

  专门用于身份验证。

命名空间:javax.servlet.http.HttpSession

 

 

 

sessionID产生和 获取

产生:服务端收到request之后,即产生session

获取:session.getId();

         或者request.getCookies[“JSESSIONID”]

在客户端,sessionID被存储在Cookie中

 

 

session登录和注销

评定:

类别

思路

比较

Cookies进行登录校验

(1)login.jsp中,遍历Cookies,判断usr是否存在。

  不存在,进行登录àreponse.AddCookie(“usrid”,usr)

à跳转到index.jsp,index.jsp中取Cookie(“usrid”),存在,则允许访问;不存在,则跳转到登录页

 

 不存在à登录

可设置时间长度。

Session进行登录校验

(1)login.jsp中,

 session.getAttribute(“usrid”)存在

则跳转到index.jsp页;

 不存在,则进行验证。验证完成

session.setAttribute(“usrid”)。跳转到页面index.jsp

 

比Cookie少一次遍历。

 

 

摘要:

 

设置session

session.setAttribute(“uid”,usrName)

获取session

session.getAttribute(“uid”)

清空session(注销)

session.invalidate()

客户端 延时跳转

response.setHeader(“refresh”,”3;url=login.jsp”)

客户端 立即跳转

reponse.sendRedirect(“login.jsp”)

 

代码:

login.jsp

<%@ page language="Java" contentType="text/html;" pageEncoding="GBK"%>

登录系统
用户名
密码

<% if(session.getAttribute("uid")!=null){

       response.addHeader("refresh","index.jsp;");

  }

  String usr=request.getParameter("usr");

  String psw=request.getParameter("psw");

  String info="";

  if(usr!=null){

         if(usr.equals("test")){

              if(psw.equals("test")){

                     info="true";

              }

              else{

                     info="密码无效";

              }

         }

         else{info="用户名不存在";  }

        

         if(info.equals("true")){

              session.setAttribute("uid",usr);

              response.sendRedirect("index.jsp");

         }

         else{%>

              <%=info%>

         <%}

}%>

 

index.jsp

<%@ page language="Java" contentType="text/html;" pageEncoding="GBK"%>

<%//注销分支

       String t=request.getParameter("t");

       if(t!=null&&t.equals("0")){

              session.invalidate();

              response.sendRedirect("login.jsp");

              return;

       }

%>

<% //校验分支

       String uid=(String)session.getAttribute("uid");

       if(uid==null){    

              response.setHeader("refresh","3;url=login.jsp");%>

              尚未登录系统..

              3

              s后跳转到登录页
点击登录系统

       <%}else{%>

       欢迎,<%=uid%>

       点击此处注销

       <%}

%>

4种会话跟踪

 

 

表单隐藏 和 地址重写 不安全。

结论:使用session 活着Cookie进行 会话跟踪。

 

session记录 用户的登录 注销时间

摘要:

session建立的时间

session.getCreationTime()

session结束的时间

session.getLastAccessedTime()

 

 

<%@ page contentType="text/html;" pageEncoding="GBK"%>

<%

       long start=session.getCreationTime();

       long end=session.getLastAccessedTime();  

       long time=(end-start)/1000;

       response.setHeader("refresh","1;url=test.jsp");

%>

您已经在页面上提留了<%=time%>秒

 


isNew()判断新session

 

 

 

 

application对象(this.getServerletContext)

所属类:javax.servlet.ServletContext

备注:this.getServletContext() 等价于application

代表:整个虚拟目录 (test1)

 

 

取虚拟目录绝对路径

摘要:

this.getServletContext().getRealPath("/")

 

<%@ page contentType="text/html;" pageEncoding="GBK"%>

虚拟目录绝对路径:<%=this.getServletContext().getRealPath("/")%>


写文件内容

摘要:

引用的jar

import=”java.io.*”

初始化File对象

File file=new File(path)

判断目录存在

file.getParentFile().exists()

创建目录

file.getParentFile().mkdir()

写入内容

PrintStream ps=new PrintStream(new FileOutputStream(file));

ps.println(fC);

ps.close();

fos.close();

 

代码:

test.jsp

<%@ page contentType="text/html;" pageEncoding="GBK"%>

      

      

      

      

      

输入文件名
文件内容

<%%>

 

file.jsp

<%@ page contentType="text/html;" pageEncoding="GBK" import="java.io.*"%>

<%

   request.setCharacterEncoding("GBK");

   String fN=request.getParameter("fNa");

   String fC=request.getParameter("fCo");

   String fPath=this.getServletContext().getRealPath("/")+"\\files\\"+fN;

   File file=new File(fPath);

   if(!file.getParentFile().exists()){

         file.getParentFile().mkdir();

   }

   FileOutputStream fos=new FileOutputStream(file);

   PrintStream ps=new PrintStream(fos);

   ps.println(fC);

   ps.close();

       fos.close();

%>

fN:<%=fN%>

fC:<%=fC%>

fPath:<%=fPath%>


读文件

摘要:

FileInputStream存文件内容

FieInputStream fiStr=

new FileInputStream(this.getServletContext().getRealPath("/")+"\\files\\file.txt")

Scanner逐行取FileInputStream

Scanner scan=new Scanner(fiStr)

遍历Scan,内容存到String中

String co="";

       while(scan.hasNext()){//逐行读取

              co+=scan.next();

       }

scan.close();

fis.close();

 

备注:

  文件内容过长时,使用

StringBuffer  buf=new StringBuffer();

buf.append(scan.next());

 

test.jsp

<%@ page contentType="text/html;" pageEncoding="GBK" import="java.util.*" import="java.io.*"%>

<%

FileInputStream fis=new FileInputStream(this.getServletContext().getRealPath("/")+"\\files\\file.txt")

Scanner scan=new Scanner(fis);

       scan.useDelimiter("\n");//使用换行符

       StringBuffer buf=new StringBuffer();

       while(scan.hasNext()){//逐行读取

              buf.append(scan.next());

       }

       scan.close();

       fis.close();

%>

      

      

      

      

文件内容

<%%>

效果

 

 

访量计数器

思路:

访客总数写到count.txt中

每当session.isNew()时,打开count.txt,取数并加1,保存,返回新数。

 

摘要:

 调试方法,在eclipse的console下进行。比用哪日志快2h

 读文件和写文件

 BigInteger 来记录数值

test.jsp

<%@ page contentType="text/html;" pageEncoding="GBK" import="java.util.*"%>

<%@ include file="fOper.jsp"%>

 

<%

       String path=this.getServletContext().getRealPath("/")+"\\files\\count.txt"; 

       BigInteger newNum;

    if(session.isNew()){

       synchronized(this){//同步操作,原因不详

              newNum=load(path);              

              newNum=newNum.add(new BigInteger("1"));

              save(path,newNum);

        }

   }

   else{

        newNum=load(path);

   }     

%>

您是第<%=newNum%>个访;

 

fOper.jsp

<%@ page pageEncoding="GBK" import="java.io.*"%>

<%@ page import="java.util.*"%>

<%@ page import="java.math.BigInteger"%>

<%!

   public static void save(String path,BigInteger count){  

                 try{

                               FileOutputStream fos=new FileOutputStream(path);

                               PrintStream ps=new PrintStream(fos);

                               ps.println(count);

                               ps.close();

                               fos.close();                                   

                        }        

                      catch(Exception e){

                            e.printStackTrace();

                            return;

                      }            

                 }

   //测试,在eclipse下进行.

    public static BigInteger load(String path){

                     try{       

                            FileInputStream fis=new FileInputStream(path);                    

                            Scanner scan=new Scanner(fis);

                            scan.useDelimiter("\n");//使用换行符

                            BigInteger count=new BigInteger("0"); //can't use 0 for para

                            while(scan.hasNext()){//逐行读取                            

                                   count=new BigInteger(scan.nextLine().trim());                

                            }                  

                            scan.close();

                            fis.close();                  

                            return count;

                     }

                     catch(Exception e){

                            e.printStackTrace();

                            return new BigInteger("0");

                     }

          }     

%>

 

 

 

 

getAttributeNames 遍历属性

 

摘要:

获取AttrNames

this.getServletContext().getAttributeNames()

Enumeration

获取某个attr的值

this.getServletContext().getAttribute(name)

 

<%@ page contentType="text/html;" pageEncoding="GBK"%>

<%@ page import="java.util.*"%>

<%

  Enumeration es=this.getServletContext().getAttributeNames(); 

  while(es.hasMoreElements()){

       String na=(String)es.nextElement();     

       %>

       Name:<%=na%>,Value:<%=this.getServletContext().getAttribute(na)%>

  <%}%>

config对象

命名空间:javax.servlet.ServletConfig

代表:web.xml对象的init-param

 

 

取DbDriver, DbUrl, usr, psw. 参见 web.xml配置

PageContext对象

 

 

 

pageContext的等价操作

page.Context

相同

pageContext.forward("login.jsp");

 

pageContext.include("login.jsp");

pageContext.getServletConfig()

config

 

 

 

不等价

pageContext.getServletRequest()取的对象是HttpServletRequest,不是request。

pageContext.getServletResponse()取的对象是HttpServletResponse,不是response.

 

备注:

pageContext在 jsp标签开发中 常见。很少直接使用。

 

 


JavaBean 规范 C7

为啥有JavaBean规范?

将Class写成 JavaBean组件,提高开发效率。

 

JavaBean被谁用?

Servlet和JSP.

JavaBean 规范的内容(对class)

 

1. Class必须放在某个Package中

2. Class必须用public声明

3.Class必须包含无参数构造函数

 

4. 属性必须用private声明

5. 要被外界操作的属性,则必须声明setter和Getter

6 属性必须用小写字母开头(很重要!,否则jsp:setProperty 无法自动赋值属性)

 

上述5条都满足的class, 即符合JavaBean 的Class.

 

JavaBean的类别

1

简单JavaBean

只包含 属性,setter,getter

2

POJO

 

3

VO

 

4

TO

属性,setter,getter, Serializable接口

 

 

 

 

简单javaBean

备注: Java默认生成不带参数的构造函数

class Person{

   private String name;

   private int age;

    public Person(){};

   public void setName(String name){

      this.name=name;

   }

   public String getName(){

      return this.name;

   }

   public void setAge(int age){

      this.age=age;

   }

   public int getAge(){

      return this.age;

   }

}

 

打包 和 调用两种方式

摘要

打包

方法1:export jar包

方法2:javac –d  目录

最后,扔到classes目录下

调用

方法1:在jsp页面中 import=”pkg.*”

方法2:

scope的取值:page, request, session, application

 

 

import Jar调用JavaBean

<%@ page language="Java" pageEncoding="GBK" import="pkgTest.*"%>

<%

  Person p1=new Person();

  p1.setName("高承荀");

  p1.setAge(26);

%>

姓名:<%=p1.getName()%>

年龄:<%=p1.getAge() %>

jsp:useBean class=”” scope=”page” id=”objName”

 

<%@ page language="Java" pageEncoding="GBK""%>

"pkgTest.Person" id="p1" scope="page">

姓名:<%=p1.getName()%>

年龄:<%=p1.getAge() %>

jsp useBean-Property  简化表单映射

 

摘要:

原始

jsp

 loop{ //n次

   obj.setPropertiy(request.getParameter)

}

jsp:setProperty

name=javaBeanId property=”*”

两句将表单中所有 name值映射到

obj对应property上

备注:Model必须符合JavaBean规范6条。否则赋值为null

 

login.htm

"test.jsp" method="post">

 

姓名:"text" name="name" value="高承荀">

 

年龄:"text" name="age" value="26">

 

邮箱:"text" name="email" value="[email protected]">
 

 

"submit" value="提交">

test.jsp

<%@ page language="Java" pageEncoding="GBK"%>

<% request.setCharacterEncoding("GBK");%>

"pkgTest.Person" id="p1" scope="page">

"p1" property="*"/>

姓名:<%=p1.getName()%>br>

年龄:<%=p1.getAge()%>br>

邮箱:<%=p1.getEmail()%>

 

jsp:setPropery  4种设置方式

 

1

property=”*”

自动 name-property映射

2

property=”属性名”

只为某property赋值

3

property=”属性名” param=”参数名”

property 获得指定 name值

4

property=”属性名” value=”内容”

perperty获得value值

 

只为某property赋值

<%@ page language="Java" pageEncoding="GBK"%>

<% request.setCharacterEncoding("GBK");%>

"pkgTest.Person" id="p1" scope="page">

"p1" property="name"/>

姓名:<%=p1.getName()%>br>

年龄:<%=p1.getAge()%>br>

邮箱:<%=p1.getEmail()%>

 

效果

 

property 获得指定 name

"pkgTest.Person" id="p1" scope="page">

"p1" property="name" param="age"/>

"p1" property="email" param="name"/>

姓名:<%=p1.getName()%>br>

年龄:<%=p1.getAge()%>br>

邮箱:<%=p1.getEmail()%>

 

姓名:26
年龄:0
邮箱:高承荀

 

property获得指定value

"pkgTest.Person" id="p1" scope="page">

"p1" property="name" value="姓名"/>

"p1" property="age" value="123"/>

"p1" property="email" value="jjkjkkj"/>

姓名:<%=p1.getName()%>br>

年龄:<%=p1.getAge()%>br>

邮箱:<%=p1.getEmail()%>

姓名:姓名
年龄:123
邮箱:jjkjkkj

 

jsp:getPropery 获取属性

摘要

取obj某个property

效果等价于<%=obj.getProperty()%>

 

"p1" property="name" value="姓名"/>

姓名:"p1" property="name"/>

姓名:姓名

 

JavaBean scope 属性

描述:obj的生存周期

1

page

页面内有效,跳转后失效。

2

request

请求内有效。(如果服务器端跳转到b.jsp,则b.jsp中有效)。

回应完请求则失效。

3

session

一次会话内有效。

浏览器关闭失效。

4

application

保存在服务器上。

服务器重启/关闭 失效。

 

删除JavaBean

摘要

序号

scope

删除语句

1

page

pageContext.removeAttribute(id);

2

request

request.removeAttribute(id);

3

session

session.removeAttribute(id);

4

application

application.removeAttribute(id);

 

 

 


应用- 注册功能

索引:Page 200

蓝图

 

 

详情:jspCode\register

摘要:

1

index.jsp 同时具备显示空白和提示功能

<%@ page language="Java" pageEncoding="GBK"%>

"person" scope="request" class="pkgTest.Person">

"check.jsp" method="post">

姓名:"text" name="name" value="<%=person.getName()%>"/><%=person.getError("nameEr")%>

年龄:"text" name="age" value="<%=person.getAge()%>"/><%=person.getError("ageEr")%>

邮箱:"text" name="email" value="<%=person.getEmail()%>"/><%=person.getError("emailEr")%>

"submit" value="提交">

 

//构造函数中,默认设置Name,Age,Email为空; JavaBean的无参数构造函数~

//getError中默认如果取到的是null,则返回””

2

check.jsp

引用index.jsp中的javaBean对象

"pkgTest.Person" id="person" scope="request">

"person" property="*">

 

 

 

3

person.java中将age设置成String

 

   private String name;

   private String age;

   private String email;

   private Map errors=null;

  

//好处:所有项都能用Regex校验

//JavaBean的set,get不会出现type不匹配

 

 

4

无参数构造函数

  public Person(){

       this.name="";

       this.age="";

       this.email="";

       this.errors=new HashMap();

    };

5

Map和HashMash

表示

[{key,value}]

//添加 errors.put("emailEr", "邮箱格式不正确");

//获取 this.errors.get(key)

//Map是一个 [{key,value}]

//这样初始化this.errors=new HashMap();

6

正则验证

姓名:if(!this.name.matches("\\w{6,15}")){

年龄:if(!this.age.matches("\\d+")){

邮箱:if(!this.email.matches("\\w+@\\w+\\.\\w+\\.?\\w*")){

 

7

两种实现思路

第1: index.htm+Servlet

第2: index.jsp+check.jsp

 

index.jsp 和check.jsp 间使用服务端跳转 到出错页

check.jsp和index.jsp间使用服务端跳转

 

 


Web开发模式

JSP-JavaBean-数据库 模式

 

摘要:

 

JSP单职责模式

职责

缺点

JSP

显示,流程控制

流程控制和前端在一起。

维护困难。

JavaBean

数据库操作

 

数据库

 

 

 

 

 

MVC模式

Model-View-Controller

 

 

Model层

JavaBean类。

View层

JSP页。

接收Servlet内容,生成和显示数据。

Controller层

处理所有http请求。

解析参数,进行流程控制。

 

 

 

关键:

Servlet中requestDistpatcher(“test.jsp”).forward(request,response)

Servlet到jsp使用request记录属性

 

 

 

MVC模式下,JSP的4规范

目的:确保jsp简洁,

 

1. 接收属性

2. 判断属性存在,流程控制

3. 使用迭代或者Model进行输出

4. 只许import “java.util.*”包

 

 

 

 


应用 MVC模式 的登录功能

//不足:(1)界面不美观(2)未加密post (比ajaxHtm+Servlet+JavaBean的MVC)

//作战目的: 熟悉  JSP+Servelet+JavaBean的MVC

            记住 JSP页面的4个规范

 

数据库准备

 使用Account数据库

 

代码清单

ClsDbConfig

数据库配置(driver,url,usr,psw)

取得Connection

关闭Connection

成员:

private,...

private Connection conn

 

方法:

public Connection getConnection

ClsDbOper

 

方法:

  public static boolean checkAccount

Account

JavaBean

成员:

 ID,usrName,password

 Map 

 

方法:

 public boolean isValidate()

 public String getError(String key)

 

svt

 

接收requestParameter

调用isValidate

--

case 校验不通过,

req.setAttribute(“info”,info);

request.getRequestDispatcher(“test.jsp”)

.forward(req,res);

 

case 校验通过,isValidate未通过

req.setAttribute(“info”,info)

req.getRequestDispatcher(“url”)

.forward(req,res)

 

case 校验通过,isValidate通过

session.setAttribute(“uid”,uid)

response.sendRedirect(url);

--

 

login.jsp

 

登录界面

错误提示

输入校验

 

index.jsp

校验session(“uid”)

case通过:欢迎

case未通过:

response.sendRedirect(“login.jsp”)

 

 

 

作战开始:14:23

完成时间:16:18

2h

 

 

 

 

设计模式

数据访问- DAO模式

DAO: Data Access Object

功能:实现CRUD功能

 

各层的功能

类别

功能

编码规则

客户层

浏览器(B/S架构)

 

显示层

JSP/Servlet页面效果显示。

 

业务层

从客户的角度,就是一个功能。

从代码的角度,就是调用一组数据层函数。

 

数据层

CRUD操作。 直接操作数据库

DAO类军规:

1.DAO类名与表名相同

2.DAO类添加,更改,删除 以 do开头。

举例:

Emp doCreat(Emp)

Emp doUpdate(Emp)

boolean doDelete(int ID)

 

3.DAO类查询 以find,

get开头

List  doFind(String key)

Emp doGet(int ID)

 

Model类军规:

Model类JavaBean规范

 

 

 

 

 

 

应用 DAO-雇员管理系统

战斗序列:

 数据库设计

(1)字段-类型-约束

(2)创建表-添加数据

 

Model类设计

    (1)类名同表名

(2)JavaBean规范开发Model类

 

DataConnection类设计

   (1)定义Driver,DbUrl,usr,psw

(2)实现getConnection()和close方法

 

DAO类设计

 

数据库设计

类型

约束

ID

Number

主键,自增

Name

varchar(10)

非空

Job

varchar(9)

非空

EmpDate

varchar(10)

雇佣日期

sal

number

薪水

min 10

 

Model类设计

 

package pkgEmp;

import java.util.HashMap;

import java.util.Map;

public class Emp{

   private int id;

   private String name;

   private String job;

   private String empDate;

   private String salary;  

   private Map errors=null;

   public Emp(){

      this.id=-1;

      this.name="";

      this.job="";

      this.empDate="";

      this.salary="";

      this.errors=new HashMap();

   }

   public boolean isValidate(){

      boolean flag=true;

      if(!this.name.matches("\\w{2,10}")){

         flag=false;

         this.errors.put("erN","姓名长度必须是2~10");

         System.out.println("Name:"+this.name+".  erN,姓名长度必须是2~10");

         return flag;

      }

      if(this.job!=null&&this.job.length()==0){

         flag=false;

         this.errors.put("erJ","工作不能为空");

         System.out.println("erJ工作不能为空");

         return flag;

      }

      if(!this.salary.matches("\\d+")){

         flag=false;

         this.errors.put("erS","薪水必须是数值");

         System.out.println("erS薪水必须是数值");

         return flag;

      }

      System.out.println(flag);

      return flag;

   }

   public String getError(String key){

      if(this.errors.get(key)==null){return "";}

      return this.errors.get(key);

   }

   public int getID(){

      return this.id;

   }

   public void setID(int id){

      this.id=id;

   }

   public String getName(){

      return this.name;

   }

   public void setName(String str){

      this.name=str;

   }

   public String getJob(){

      return this.job;

   }

   public void setJob(String str){

      this.job=str;

   }

   public String getEmpDate(){

      return this.empDate;

   }

   public void setEmpDate(String str){

      this.empDate=str;

   }

   public String getSalary(){

      return this.salary;

   }

   public void setSalary(String str){

      this.salary=str;

   }

}min5

 

DbConnection类

private DbDriver

 

private DbUrl

 

private Usr

 

private Psw

 

public static getCoonection

return this.conn

 

public class DbConnection {

   public static final String DbDriver="oracle.jdbc.driver.OracleDriver";

   public static final String DbUrl="jdbc:oracle:thin:@localhost:1521:orcl";

   public static final String Usr="test";

   public static final String Psw="test"; 

   public static Connection getConnection() throws ClassNotFoundException, SQLException{

      Connection con=null;

      Class.forName(DbDriver);

      con=DriverManager.getConnection(DbUrl, Usr, Psw);

      return con;

   }

}

min 10

 

 

 

 

DAO类设计

public Emp doCreate(Emp emp)

public List find(String key)

public Emp getById(int ID)

 

 public static Emp doCreate(Emp emp) throws ClassNotFoundException, SQLException{

       Connection con=DbConnection.getConnection();   

       String sqlStr="insert into emp(Name,Job,EmpDate,Salary) values('"+emp.getName()+"','"+emp.getJob()+"','"+emp.getEmpDate()+"',"+emp.getSalary()+") returning ID into :1";

       OraclePreparedStatement pstmt =(OraclePreparedStatement)con.prepareStatement(sqlStr); 

       pstmt.registerReturnParameter(1, Types.NUMERIC); 

       pstmt.executeUpdate(); 

       ResultSet rs=pstmt.getReturnResultSet(); 

       rs.next(); 

       emp.setID(rs.getInt(1)); 

       rs.close(); 

       pstmt.close();         

       con.close();

       return emp;

   }

   public static List find(String key) throws ClassNotFoundException, SQLException{

      List li=new ArrayList();

      Connection con=DbConnection.getConnection();

      String sqlStr="select ID,Name,Job,EmpDate,Salary from emp";

      if(!key.equals("")){sqlStr+=" where Name like '%"+key+"%'";}

      Statement stmt=con.createStatement();

      ResultSet rs=stmt.executeQuery(sqlStr);

      while(rs.next()){

         Emp emp=new Emp();

         emp.setID(rs.getInt("ID"));

         emp.setName(rs.getString("Name"));

         emp.setJob(rs.getString("Job"));

         emp.setEmpDate(rs.getString("EmpDate"));

         emp.setSalary(rs.getString("Salary"));

         li.add(emp);

      }

      return li;

   }

   public static Emp getById(int ID) throws SQLException, ClassNotFoundException{

      Connection con=DbConnection.getConnection();

      String sqlStr="select ID,Name,Job,EmpDate,Salary from emp where ID="+ID;

      Statement stmt=con.createStatement();

      ResultSet rs=stmt.executeQuery(sqlStr);

      Emp emp=new Emp();

      while(rs.next()){       

         emp.setID(rs.getInt("ID"));

         emp.setName(rs.getString("Name"));

         emp.setJob(rs.getString("Job"));

         emp.setEmpDate(rs.getString("EmpDate"));

         emp.setSalary(rs.getString("Salary"));        

      }

      return emp;

   }

 

min20

 

测试DAO

/*

      for(int i=0;i<=4;i++){

         Emp emp=new Emp();

         emp.setName("李兴华"+i);

         emp.setJob("程序员"+i);

         emp.setEmpDate("2012-01-0"+i);

         emp.setSalary(String.valueOf(1000*(i+2)));

         doCreate(emp);

      }*/

      /*

      List emps=find("李");

      for(int i=0;i<=emps.size()-1;i++){

         System.out.println(emps.get(i).getName());

      }

      */

      /*

      Emp emp=getById(2);

      System.out.println(emp.getName());

      */

min10

 


Jsp 添加

insert.jsp

字段信息输入,提示信息错误

doCreate.jsp

校验信息,执行添加。

添加成功则显示。

添加失败则跳转到insert.jsp并提示错误。

insert.jsp

<%@ page language="Java" pageEncoding="GBK"%>

<%request.setCharacterEncoding("GBK");%>

"emp" class="pkgEmp.Emp" scope="request"/>

"doCreate.jsp" method="post">

  

  

  

  

  

姓  名"text" name="name" value="<%=emp.getName()%>"/><%=emp.getError("erN")%>
职  位"text" name="job" value="<%=emp.getJob()%>"/><%=emp.getError("erJ")%>
受聘日期"text" name="empDate" value="<%=emp.getEmpDate()%>"/><%=emp.getError("erE")%>
薪  资"text" name="salary" value="<%=emp.getSalary()%>"/><%=emp.getError("erS")%>
3>"submit" value="提交"/>

 

 

doCreate.jsp

<%@ page language="Java" pageEncoding="GBK" import="pkgEmp.*"%>

<%request.setCharacterEncoding("GBK");%>

"pkgEmp.Emp" id="emp" scope="request"/>

"emp" property="*"/>

<%if(emp.isValidate()){

   Emp emp2=DbOper.doCreate(emp);

   if(emp2.getID()!=-1){%>

     

添加成功

      姓名:<%=emp2.getName()%>

      工作:<%=emp2.getJob()%>

      受聘日期:<%=emp2.getEmpDate()%>

      薪水:<%=emp2.getSalary()%>

   <%}else{%>

      "insert.jsp"/>

   <%}%>

<%}else{%>

      "insert.jsp"/>

<%}%>


 

Jsp显示

list.jsp

查询关键字输入框

--

table显示信息

list.jsp

<%@ page language="Java" pageEncoding="GBK" import="pkgEmp.*"%>

<%@ page import="java.util.*" %>

<%

    request.setCharacterEncoding("GBK");

   String key="";

   key=request.getParameter("key")==null?"":request.getParameter("key");  

   List emps=DbOper.find(key);

   String dataStr="";

%>

"emp_list.jsp" method="post">

请输入查询关键字:"text" value="" name="key"/>"submit" value="查询">

1>

<%for(int i=0;i<=emps.size()-1;i++){ %>

<%}%>

姓名工作入职日期薪资
<%=emps.get(i).getName()%><%=emps.get(i).getJob()%><%=emps.get(i).getEmpDate()%><%=emps.get(i).getSalary()%>

 


文件上传

smartUpload手册

参考jspsmartupload.zip

 

图片上传

jar包:jspSmartUpload.jar

特点:(1)可限制类型

      (2)获取文件名、类型、尺寸

额外依赖:

   jsp-api.jar    (tomcat自带)

   servlet-api.jar  (tomcat自带)

 

备注:放在lib目录下

 

摘要:

  (1)表单中使用 上传

任务

upload.htm

(1)

   input标签 上传

(2) form action=”su”

   指向svt

pkgUpload.ClsUpload

(1)取文件-检查合法性-保存-页面跳转

 

依赖项

(1)jsp-api.jar

(2)servlet-api.jar

(3)jspSmartUpload.jar

 

 

upload.htm

"white">

jspSmartUpload : Sample 1


"POST" ACTION="su" ENCTYPE="multipart/form-data">

   "FILE" NAME="FILE1" SIZE="50">
  

   "SUBMIT" VALUE="Upload">

   "text" name="info" value="test photp"/>

 

ClsUpload.java

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

      // TODO Auto-generated method stub

        //存储路径

          String filePath = "F:\\Workspaces\\UI05\\UI05\\WebContent\\upload\\";

           String messages="";

           String forward="";

          

           SmartUpload su = new SmartUpload();   

           long maxsize = 2 * 1024 * 1024;// 设置大小,为2MB

           String allowedFilesList = "jpg,gif,bmp,png";//允许文件

//拒绝文件        

String denidFilesList = "exe,bat,jsp,htm,html,,";  

                  

           try {            

               su.initialize(this.getServletConfig(), request, response);        //初始化

               su.setMaxFileSize(maxsize);                                     // 限制上传文件的大小

               su.setAllowedFilesList(allowedFilesList);                        // 设置允许上传的文件类型

               su.setDeniedFilesList(denidFilesList);  

               su.upload();                                                    // 上传文件                             

                                           

              // 获取上传的文件,因为只上传了一个文件,所以可直接获取

                File file = su.getFiles().getFile(0);

                // 如果选择了文件

                if (!file.isMissing()) {            

                //获取当前时间并格式化为字符串

                    String now = new Date().getTime() + "";                  

                   //filePath值

                    String photoAddr=filePath + now + "."+file.getFileExt();       

                    System.out.println(photoAddr);                                 

                    file.saveAs(photoAddr,File.SAVEAS_PHYSICAL);

                }else{

                System.out.println("file is Missing()");

                    messages="请选择要上传的文件!";

                    forward="/admin/error.jsp";

                }               

                          

           }catch (java.lang.SecurityException e){

             System.out.println("上传失败82");

               messages="

  • 上传文件失败!上传的文件类型只允许为:jpg,gif,bmp
  • ";

                   forward="/admin/error.jsp";           

               }catch (SmartUploadException e) {

                 System.out.println("上传失败86");

                   messages="上传文件失败!";

                   forward="/admin/error.jsp";

                   e.printStackTrace();

               } catch (SQLException e) {

                 System.out.println("92");

                   e.printStackTrace();

               }               

               request.setAttribute("messages",messages);       

               request.getRequestDispatcher(forward).forward(request, response);      

       }

    }

     


    混合表单处理

    背景:客户端form中包含照片 和 备注信息

     

    摘要:

        SmartUpload su = new SmartUpload();

          su.initialize(this.getServletConfig(),request, response);

          su.setAllowedFilesList("jpg,gif,bmp,png");//允许文件 

          su.setMaxFileSize(2 * 1024 * 1024);// 设置大小,为2MB

    su.getRequest.getParameter(“info”)

    取备注信息

    su.getFiles().getFile(0)

    取文件

     

    htm

    "GBK"/>

    "sa" method="post" enctype="multipart/form-data">

    姓名"text" name="name"/>
    照片"file" name="photo"/>
    2>"submit" value="提交"/>"reset" value="重置"/>

     

    svt

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

       request.setCharacterEncoding("GBK");

       SmartUpload su = new SmartUpload();

       su.initialize(this.getServletConfig(),request, response);

       su.setAllowedFilesList("jpg,gif,bmp,png");//允许文件 

       su.setMaxFileSize(2 * 1024 * 1024);// 设置大小,为2MB 

       Map info=new HashMap();

      

       try {

          su.upload();

       } catch (SmartUploadException e1) {

          e1.printStackTrace();

          info.put("false", "上传发生错误");

       }           

        String name=su.getRequest().getParameter("name");        

        File fi=su.getFiles().getFile(0);                      

        if(!info.isEmpty()){

           request.setAttribute("failReason",info.get("false"));

           request.getRequestDispatcher("/re.jsp").forward(request,response);

           return;

        }       

        String fiName=new Date().getTime()+"."+fi.getFileExt();

        System.out.println(fiName);

        try {

          fi.saveAs(this.getInitParameter("dirPic")+"\\"+fiName,File.SAVEAS_PHYSICAL);

       } catch (SmartUploadException e) {  

          e.printStackTrace();

          request.setAttribute("failReason","保存发生错误");

          request.getRequestDispatcher("/re.jsp").forward(request,response);

          return;

       }

        request.removeAttribute("failReason");

        System.out.println(name);

        request.setAttribute("name",name);

        //request.setAttribute("url","/pics/"+fiName);//host/pics/

        request.setAttribute("url","pics/"+fiName);//host/vir/pics

        request.getRequestDispatcher("/re.jsp").forward(request,response);

        return;

    }

     

    re.jsp

    <%@ page language="Java" contentType="text/html" pageEncoding="GBK"%>

    <% if(request.getAttribute("failReason")!=null){%>

    保存失败,原因:

    <%=request.getAttribute("failReson")%>

    <%}else{%>

     保存成功

     

    姓名:<%=request.getAttribute("name")%>

     

    <em"照片" src="<%=request.getAttribute("url")%>"/>

    <%  }%>

     

     

     

    Servlet

    背景知识

    Servlet本质

    继承了HttpRequest的 java类。 它是一个.java文件

    依赖项

      将tomcat/lib/servlet-api.jar拷贝到Web-inf/lib目录下

    结构

    pkgSvt

      ClsSvt

    引用

    Export jar到:

    WebContent/WEB-INF/classes

    web.xml映射

      sA

      pkgSvt.ClsSvt

      sA

      pkgSvt.ClsSvt

     

     

     

    svt比CGI的优势

    svt多线程, 项目比CGI高。

     

     

     

     

    第一个Servlet

    创建Servlet

    1.创建servlet, 输入package Name(对应nameSpace和className(servletName)

     

    package servletPack;

    public class ReqHandler extends HttpServlet {//继承HttpServlet

     

    备注:servletPack.ReqHandler 之后将写入 servlet-class

     

    2.把这个java的doGet写上代码。

     

    // TODO Auto-generated method stub

       protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

          // TODO Auto-generated method stub

          PrintWriter print=response.getWriter();

           String result="

    Hello World

    ";

           print.print(result);

       }

     

     

     

     

     

     

     

     

     

     

     

     

    将servletPackage导出成jar,并拷贝到WebContent/Web-inf/classes目录下

     

     

    web-inf\web.xml 配置信息

     

    在Web-Inf的Web.xml中添加请求映射

     

     

    "1.0" encoding="utf-8"?>

    SvtHello

    pkgResiCrud.SvtHello

    SvtHello

    /hello

     

     

    备注:

    1. 标签下的下的相同

     2.s写packageName.servletName

     3.servlet-name不要和url-pattern完全相同,否则tomcat无法启动,譬如

    SvtHello

    /SvtHello

     

    即可

     

     

    访问url:

    http://ip/webAppName/hello

    访问url,测试

     


    获取Ajax的postData

    结论:request.getInputStream

    //数据流

          ServletInputStream inpStream=request.getInputStream();

          //数据流总长

          int dataLength=request.getContentLength();

          //已读长度

          int readLength=0;

          //本次读取长度

          int curLength=0;     

          //存放数据流的 byte数组

          byte[] byteArr=new byte[dataLength];

          while(readLength

             curLength=inpStream.read(byteArr);

             readLength+=curLength;

          }

         

          String dataString=new String(byteArr,"utf-8");

          System.out.println("dataGet:"+dataString);


    获取form.submit的data

    结论:request.getParameter(name)

     

    test.html

     

    "button" id="btnTest1" value="getXls"/>

    "frmDownload" method="post" style="display:none">

       "text" name="postData" id="inpPostData"/>

     

     

    servlet

    String postData=request.getParameter("postData");

          System.out.println(postData);

     

    获取url中的参数

    结论:request.getQueryString()

     

    test.html

    function bindEvents(){

       $("#btnTest1").on("click",function(){

          $("#frmDownload")[0].action="../resiCrud?para1=1¶2=2";

          var postData={cmd:5,data:null};

          $("#inpPostData").val(JSON.stringify(postData));    

          $("#frmDownload")[0].submit();

       });

    }

    "button" id="btnTest1" value="getXls"/>

    "frmDownload" method="post" style="display:none">

       "text" name="postData" id="inpPostData"/>

     

    servlet

       protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

          // TODO Auto-generated method stub         

          String postData=request.getParameter("postData");

          System.out.println("postData:"+postData);

          String queryStr=request.getQueryString();

          System.out.println("queryString:"+queryStr);

          ....

     

    输出结果:

    postData:{"cmd":5,"data":null}

    queryString:para1=1¶2=2

    冲突 getParameter和getInputStream()

     

    结论:

       对象HttpServletRequest, getParameter()执行之后,会让getInputStream()的值发生改变。反之亦然。

     

    because POST data can be read only once

     

      

    解决方法:

    在url中添加queryString。暗示使用getParameter还是getInputStream来获取request参数

     

     

            //从form来 

            String queryStr=request.getQueryString(); 

            System.out.println("queryString:"+queryStr);

          //从getInputStream中取参数

            if(queryStr==null){

             

           }

    //从getParameter中取参数

        else if(queryStr.equals("para")){

        }

     


    取config,session, application对象

     

    config

    this.getServletConfig()

    session

    request.getSession()

    application

    this.getServletContext()

     

     


    svt中取servlet initParam

    摘要:

     init-param 存在于 servlet标签下。不能直接放在web-app目录下。

     一个servlet标签下可以存放多个init-param

    web.xml配置

    在对应servlet标签下 添加

    svt中获取

    使用this.getServletContext.getInitParameter(“name”)

     

     

        sA

        pkgSu.ClsSu

       

          dirPic    F:\\Workspaces\\UI05\\UI05\\WebContent\\pics

       

     

     

          this.getServletContext().getInitParameter(“dirPic”)

     

     


    svt 客户端跳转

     

    response.sendRedirect("http://www.baidu.com");

     

    svt服务端跳转

    摘要:等价于

    request.getRequestDispatcher(url).forward(request, response);

     

    参数:url-要跳转的路径。 request-传递参数,response-传递参数

     

     

    Svt返回页面

    摘要:

    设置页面字符串

    StringBuffer.append(“...”);

    response 页面字符串

     PrinterWriter pw=reponse.getWrite();

     pw.write(buf.toString());

     pw.close()

     

     

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

          // TODO Auto-generated method stub

          this.doPost(request, response);

       }

     

       /**

        * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)

        */

       protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

          // TODO Auto-generated method stub

          StringBuffer buf=new StringBuffer();

          response.setCharacterEncoding("utf-8");

          buf.append("");

          buf.append("

    Page write by PrinterWriter

    测试Svt输出页

    ");

          PrintWriter pw=response.getWriter();

          pw.write(buf.toString());

          pw.close();//关闭响应

       }


    ajax,jsp,svt制作页面比较

    结论:使用ajax制作页面,使用svt处理请求

    方便程度排序:

    Ajax>jsp>svt

    代码分离程度:

    Ajax>jsp>svt

     

    思路

    工具

    ajax

    html,css,jq,js

    jsp

    <%%>

    html

    svt

    StringBuffer

    PriterWriter

     

    Servlet生命周期

     

    阶段

    前件

    时间

    初始化

    int()

    (1)jar在class目录下

    (2)web.xml 中servletMapping

    web容器启动时

    (tomcat\bin\startup)

    服务

    doGet(),doPost()

    初始化完成

    接到http请求

    中止,释放

    destroy()

     

    以下任意:

     (1)web容器关闭

     (2)接到卸载svt指令

     

     

     

    过滤Servlet

    摘要:

     

    作用

    限制客户对WebContent中资源的访问

    本质

    实现了 servlet.Filter的 java Class

     

    主要方法:

    init()

    web容器启动时,调用FilterConfig取得配置参数

    doFilter()

    完成过滤操作

    destroy()

    结束过滤器,释放资源

     

     



     

                        

     


     

     

     

     

     


     

     

     

    ResultSet

    获取记录条数

       Class.forName("oracle.jdbc.driver.OracleDriver");

         

          Connection conn=DriverManager.getConnection("");

          Statement std=conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);

          String sqlStr="select * from Resident";

          ResultSet rs=std.executeQuery(sqlStr);

         

          //获取记录条数.

          int rowCount=0;      

          rs.last();

          rowCount=rs.getRow();

          System.out.println("rowCount:"+rowCount);

          //将cursor移到第一条

          rs.first();

         

         

          String result="[";      

          while(rs.next()){

             //Todo.....

          }

    遍历所有字段

    停用:

    rs.getString(0) 值会变化,停用

     

    使用:

    rs.getString(“Name”);                                  


    正则-String

    Java 正则

    分组

    String Str="{District:4,hyID:6,IsActivated:2}";

          //(?\\d),将\\d存储到group,dVal中

           Pattern pat = Pattern.compile("District:(?\\d),");

           Matcher m = pat.matcher(Str);           

           while(m.find()) {

               System.out.println(m.group("dVal"));//group(para),para即分组号

            }

           

          //(\\d),()将被分组,从1开始编号.读取 用m.group(1). 备注:group(0)对应整个匹配项

           Pattern pat2 = Pattern.compile("District:(\\d),"); 

           m=pat2.matcher(Str);

           while(m.find()) {

               System.out.println(m.group(1));//group(para),para即分组号

            }

     

    输出:

    4

    4

    姓名-年龄-邮箱

    姓名:if(!this.name.matches("\\w{6,15}")){

    年龄:if(!this.age.matches("\\d+")){

    邮箱:if(!this.email.matches("\\w+@\\w+\\.\\w+\\.?\\w*")){


    String

    replaceAll替换字符串中的所有 \”null\”

    背景:rs.getString(“Address”)会将null值表示成 \”null\”.

    返回给前端的JSON串要写成Address:””

     

      String oStr="\"null\" is null";

         String dStr=oStr.replaceAll("\"null\"","\"\"");

         System.out.println("dString is:"+dStr);

     

    字符串相等

     在编程中,通常比较两个字符串是否相同的表达式是“==”,但在Java中不能这么写。在Java中,如果要比较a字符串是否等于b字符串,需要这么写:

          if(a.equals(b)){

          }

     

    原因:

    由于字符串是对象类型,而使用equals()方法比较两个对象的内容

     

    字符串非空

    if(queryStr!=null&&queryStr.length()>0){

    }

    字符串为空

    queryStr==null|| queryStr.length()==0

     


    String byte[]互相 转换

     

     

       String str="你";

          byte[] b=str.getBytes("UTF-8");

          for(int i=0;i<=b.length-1;i++){

             System.out.println(b[i]);

          }    

          String back=new String(b);

          System.out.println(back);

     

    String+ 和 StringBuffer.append比较

     

    摘要:

       String +被转换成 StringBuffer执行 append操作。

       编码中使用StringBuffer效率高。

    public static String strPlus(String a,String b){

          /* StringBuffer sA=new StringBuffer(a);

           * sA.append(b);

           * return sA.toString();

           * */

          return a+b;

       }

       public static String strAppend(String a,String b){

          StringBuffer sb=new StringBuffer(a);

          sb.append(b);

          return sb.toString();

       }

     

     

    JSON处理

    客户端JSON处理

    解析responseString

     

    即使是一个JSON对象,不用数组传回去。eval提示字符串错误。

    未知原因。

    建议用[]包裹字符串

     

    将requestData 转成JSONString

    var reqData={cmd:0,data:null};

    JSON.stringify(reqData)

     

    服务端JSON处理

    JSON字符串和JSON对象的差异(重要)

    JSON字符串,要求属性名加双引号。如果属性值是对象,对象花括号不要引号

    举例:

    {"Done":true,"Info":{"ID":15090,"Longitude":116.32502,"Latitude":40.00006}}

     

    JSON对象, 属性名不要双引号

     

    JSONView的检验能通过,但JSON.parse出错,一定是因为,有属性名没有加引号

     

     

     

     

          

     

    将ResultSet写成JSON字符串

      result+="{\"ID\":"+rs.getString("ID")+",\"Name\":\""+rs.getString("Name")+"\",\"Age\":"+rs.getString("Age")+",\"Job\":\""+rs.getString("Job")+"\"},";

     

    属性名也要加引号。否则前端无法用JSON.parse转

    字符串值需要加引号。

    Gson 的toJSON和fromJSON

    Gson由google开发

     

     

    Gson gson = new Gson(); // Or use new GsonBuilder().create();

     MyType target = new MyType();

     

    //Class转Json字符串

     String json = gson.toJson(target); // serializes target to Json

     

    //Json字符串转Class

     MyType target2 = gson.fromJson(json, MyType.class); // deserializes json into target2

     

     

     

    jdbc

    ojdbc位置:

    Oracle安装目录

    app\product\11.2.0\dbhome_1\jdbc\lib\ojdbc6.jar

    放在javaProject的 src目录下。

     

    插入 (返回最新记录)

     

    http://blog.csdn.net/yzsind/article/details/6918506

     

    //添加商户, 返回最新添加

       public static String InsertShop(Shop shop) throws ClassNotFoundException, SQLException{              

           Class.forName("oracle.jdbc.driver.OracleDriver");

           Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:orcl", "gxk", "gxk");        

                                     

           String vsql = "insert into shopmbase(ID,Num,InnerNum,Name,InstallDate,Address,Active,IsActivated) values(shm_sequence.nextval,'"+shop.Num+"','"+shop.InnerNum+"','"+shop.Name+"','"+shop.InstallDate+"','"+shop.Address+"','"+shop.Active+"','"+shop.IsActivated+"') returning ID into :1";      

           OraclePreparedStatement pstmt =(OraclePreparedStatement)conn.prepareStatement(vsql); 

           pstmt.registerReturnParameter(1, Types.NUMERIC); 

           pstmt.executeUpdate(); 

           ResultSet rs=pstmt.getReturnResultSet(); 

           rs.next(); 

           int ID=rs.getInt(1); 

           rs.close(); 

           pstmt.close();         

           shop.ID=ID;

          

          return new Gson().toJson(shop);

       }

     

     

     

    更新

    //更新商户

       public static String UpdateShop(Shop[] shops) throws ClassNotFoundException, SQLException{     

           Report result=new Report();     

           result.Done=false;  

           Class.forName("oracle.jdbc.driver.OracleDriver");

           Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:orcl", "gxk", "gxk");  

           Statement stmt=conn.createStatement(); 

               

           int updated=0;

           for(int i=0;i<=shops.length-1;i++){

              String sqlStr="update shopmbase set Num='"+shops[i].Num+"',InnerNum='"+shops[i].InnerNum+"',Name='"+shops[i].Name+"',InstallDate='"+shops[i].InstallDate+"',CZDate='"+shops[i].CZDate+"',CLDate='"+shops[i].CLDate+"',Address='"+shops[i].Address+"',IsActivated='"+shops[i].IsActivated+"',Active='"+shops[i].Active+"',Longitude="+shops[i].Longitude+",Latitude="+shops[i].Latitude+" where ID="+shops[i].ID; 

              int val=stmt.executeUpdate(sqlStr);

              if(val!=0){

                 updated++;

              }

           }

           result.Done=true;

           result.Info=updated+" of "+shops.length+" are updated";                  

           stmt.close();

           conn.close();

           String report=new Gson().toJson(result);

           report="["+report+"]";

           System.out.println(report);

           return report;

       }

    删除

    delete from where

     

     

     

    查询

    select from where

     

    rs.close 将触发stmt.close

     

    说明:

       rs1=stmt.executeQuery(sql1);

       rs2=stmt.executeQuery(sql2);

       rs2.close();//stmt也将被close()

     

       System.out.println(rs.next())  //false; stmt.close之后,rs1.close()

     

     

     

     

     

     

    Connection conn = DriverManager.getConnection(ClsDbConfig.dbUrl,ClsDbConfig.userName, ClsDbConfig.password);  

           Statement  stmt = conn.createStatement(); 

           String sqlStr="select distinct type from shopothattr";

           

           /*结果

            * [{attrName:"设备状态",values:[{text:'未激活',value:1}]},{attrName:"商户类型"}..]

            * */

           String result="[";

           ResultSet rs=stmt.executeQuery(sqlStr);   

           while(rs.next()){

              result+="{\"attrName\":\""+rs.getString("type")+"\",\"values\":[";

              String sqlStr2="select id,type,value from shopothattr where type='"+rs.getString("type")+"'";

              Statement  stmt2 = conn.createStatement();

              ResultSet rs2=stmt2.executeQuery(sqlStr2);

              while(rs2.next()){

                 result+="{\"text\":\""+rs2.getString("value")+"\",\"value\":"+rs2.getInt("id")+"},";

              }

              result=result.substring(0,result.length()-1);

              result+="]},";

                       

              rs2.close();

              stmt2.close();

           }

           result=result.substring(0,result.length()-1);

           result+="]";

              

           rs.close();

           stmt.close();

           conn.close();

     


     

     

     


    数制-编码-加密

    编码-数制

    byte[] 和String 互相转换

    摘要:

      

    字符串转byte[]

    byte[] b= str.getBytes(“UTF-8”)

    byte[]转字符串

    String str=new String(b);

     

           String str="你好世界1234qwER~!@#$%^&*()_+";

          byte[] b=str.getBytes("UTF-8");                     

          String back=new String(b);

          System.out.println(back);

     

    char和int的转换

    结论:Unicode中共65535个字符。

          使用0-65535这些数字,即可表示全球所有字符。

     

          //ASCII 字符和int互相转换

          for(int i=0;i<=127;i++){       System.out.print(i+":"+(char)(i)+","+(int)((char)(i))+" ");

          }

     

    所有Unicode字符

    System.out.print("\n");

          for(int i=0;i<=65535;i++){

             System.out.print(i+":"+(char)(i)+"  ");

          }

     

     

         

    char和Unicode互相转换

    本质:char和int的互相转换

    Unicode:万国码

           \uDFEF 

           \u 4个16进制位。

           总共有65535种取值。

           映射了全球所有字符。

     

    备注:Java中int范围是 -21.47亿-21.47亿。

          codePointAt(s) 的范围完全涵盖unicode所有值

    摘要:

       char转unicode,\\u+Integer.toHexString(char);

       unicode转char,(char)Integer.parseInt(uni.subString(2),16);

     

    /*unicode转字符

       */

       public static char unicodeToChar(String uni){       

          if(!uni.subSequence(0,2).equals("\\u")){

             return ' ';

          }          

          return (char)Integer.parseInt(uni.substring(2),16);

       }

       /*字符转Unicode

        */

       public static String charToUnicode(char c){

          String result="\\u";    

          result+=Integer.toHexString(c);

          return result;

       }

     

     


    String和int[]转换

    应用:用户名加密发送

    String usr="1234qwER你好世界";     

          //字符串转 int[]数组

          int[] intAr=new int[usr.length()];

          StringBuffer sb1=new StringBuffer();   

          for(int i=0;i<=usr.length()-1;i++){

             intAr[i]=usr.codePointAt(i);

             sb1.append(intAr[i]).append(",");

          }          

          System.out.println(sb1.substring(0, sb1.length()-1));

          //int数组转字符串

          StringBuffer sb=new StringBuffer();

          for(int i=0;i<=intAr.length-1;i++){

             sb.append((char)intAr[i]);

          }

          System.out.println(sb.toString());

     

    输出:

    49,50,51,52,113,119,69,82,20320,22909,19990,30028

    1234qwER你好世界

     

    十进制-十六进制

     Integer.toHexString(120);

     

     Integer.parseInt(“8C”,16);

     


     


     

    加密

    备注:加密的基础是 编码转换

    sha256加密

     

    //hash是单向的...无解密方式

    //破解方式只有一个, 尝试字符串,获得相同的hash序列,则表明明文

    //结果:sha256的结果是64位字符串

       public static String ShaEncrypt(String mes){

          String result="";

          MessageDigest digest;

            try {

                digest = MessageDigest.getInstance("SHA-256");

                byte[] hash = digest.digest(mes.getBytes("UTF-8"));

                result = Hex.encodeHexString(hash); 

                return result;

            } catch (NoSuchAlgorithmException e) {

                // TODO Auto-generated catch block

                e.printStackTrace();           

            }catch (UnsupportedEncodingException e) {

                // TODO Auto-generated catch block

                e.printStackTrace();

            }

            return result;

    }

     

     


    对称,unicode-偏移

     

    摘要:

      编码:将String 转成int[]数组,每个元素+10000

      还原:将每个元素-10000,然后变成char

    public static void main(String[] args) throws UnsupportedEncodingException{        

          String usr="1234qwER你好世界";

          System.out.println(encodeUsr(usr,10000));

          System.out.println(getUsr(encodeUsr(usr,10000),10000));

       }       

       //从数组获取字符串

       public static String getUsr(int[] arInt,int delta){

          StringBuffer sb=new StringBuffer();

          for(int i=0;i<=arInt.length-1;i++){

             sb.append((char)(arInt[i]-delta));

          }

          return sb.toString();

       }

       //将字符串编码成数组

       public static int[] encodeUsr(String str,int delta){

          int[] res=new int[str.length()];

          for(int i=0;i<=str.length()-1;i++){

             res[i]=str.codePointAt(i)+delta;

          }

          return res;

       } 


     

     

     

     

     

     

     

     

     

     

     


    Excel操作 (jxl)

    写Excel

    import java.io.File;

    import jxl.*;

    import jxl.write.*;

    import jxl.write.biff.RowsExceededException;

     

      public static void main(String[] args) throws IOException, RowsExceededException, WriteException {     

     

     

             WritableWorkbook book=Workbook.createWorkbook(new File("WebContent/test.xls"));

             WritableSheet sheet=book.createSheet("fistPage", 0);

             //在col0,row0添加 内容为test的cell

             Label lable=new Label(0,0,"test");

             sheet.addCell(lable);

     

     

             //在col1,row0添加数值789.123      

             jxl.write.Number number=new jxl.write.Number(1,0,789.123);

             sheet.addCell(number);

            

             //保存book

             book.write();

             book.close();

            

             System.out.println("Mission Done");

       }

     

    备注:文件 默认输出路径是 Workspace目录


    读取Excel

    public static String getShopsFromXls(String path) throws IOException, BiffException{

          String result="[";

          Workbook book=Workbook.getWorkbook(new File(path));

          Sheet sheet=book.getSheet(0);

          //遍历所有行

          for(int i=1;i<=sheet.getRows()-1;i++){

             result+="{No:"+i+",Num:'"+sheet.getCell(0,i).getContents()+"',InnerNum:'"+sheet.getCell(1,i).getContents()+"',Name:'"+sheet.getCell(2,i).getContents()+"',SDDate:'"+sheet.getCell(3,i).getContents()+"',CLDate:'"+sheet.getCell(4,i).getContents()+"',CZDate:'"+sheet.getCell(5,i).getContents()+"',Activated:'"+sheet.getCell(6,i).getContents()+"',Address:'"+sheet.getCell(7,i).getContents()+"',HYSH:'"+sheet.getCell(8,i).getContents()+"'},";

          }

          result=result.substring(0,result.length()-1);

          result+="]";

          return result;

       }

     


    导出InputStream

     

     

       public static InputStream createExcel(String filePath) throws ClassNotFoundException, SQLException, IOException, WriteException{                   

               String[] arrCols={"身份证","姓名","教育程度","血型","工作单位","性别","曾用名","出生日期","身高(cm)","电话","地址","民族","婚姻状况"};

                  String[] arrFields={"IDNUM","NAME","EDUCATION","BLOODTYPE","WORKUNIT","GENDER","OLDNAME","to_char(Birthdate,'yyyy-mm-dd') as BIRTHDATE","TALL","PHONE","ADDRESS","PEOPLE","MARRIAGE"};                       

                  String[] arrFields2={"IDNUM","NAME","EDUCATION","BLOODTYPE","WORKUNIT","GENDER","OLDNAME","BIRTHDATE","TALL","PHONE","ADDRESS","PEOPLE","MARRIAGE"};

                 

                  String sqlStr="select ";

               for(int i=0;i<=arrFields.length-1;i++){

                     sqlStr+=arrFields[i]+",";

               }

               sqlStr=sqlStr.substring(0, sqlStr.length()-1);

               sqlStr+=" from Resident";

                 

               System.out.println(sqlStr);

               Class.forName("oracle.jdbc.driver.OracleDriver");                

                  Connection conn=DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:orcl", "gxk", "gxk");

                  Statement std=conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);                                     

                  ResultSet rs=std.executeQuery(sqlStr);

                 

                 

            WritableWorkbook book=Workbook.createWorkbook(new File(filePath));

                  WritableSheet sheet=book.createSheet("fistPage", 0);

                  //设置列宽  此单位非像素,比值是1:7

                  int[] arrWidths={23,10,10,10,32,10,10,12,11,10,10,10,10};                 

                  for(int i=0;i<=arrWidths.length-1;i++){

                         sheet.setColumnView(i, arrWidths[i]);                      

                  }

                 

                  //表头 (colNum,rowNum)

                  WritableFont fontBold = new WritableFont(WritableFont.TIMES,12,WritableFont.BOLD);              

                  WritableCellFormat headFormat=new WritableCellFormat(fontBold);

                  headFormat.setAlignment(jxl.format.Alignment.CENTRE);

     

                  for(int i=0;i<=arrCols.length-1;i++){

                         Label cell=new Label(i,0,arrCols[i],headFormat);

                         sheet.addCell(cell);   

                  }                  

                                      

                  //表体

                  WritableFont fontNormal = new WritableFont(WritableFont.TIMES,12);

                  WritableCellFormat bodyFormat=new WritableCellFormat(fontNormal);

                  bodyFormat.setAlignment(jxl.format.Alignment.CENTRE);

                 

                  int j=1;

                  while(rs.next()){

                         for(int i=0;i<=arrFields2.length-1;i++){             

                                //System.out.println(arrFields2[i]+":"+rs.getString(arrFields2[i]));

                                //Label cell=new Label(i,j,rs.getString(i)); rs.getString(序号) 值会变化,停用

                                Label cell=new Label(i,j,rs.getString(arrFields2[i]),bodyFormat);                             

                                sheet.addCell(cell);

                         }

                         j++;

                  }

                               

                  //保存book

                  book.write();

                  book.close();

                  InputStream inStream=new FileInputStream(filePath);   

                  return inStream;

       }

     

     

     

     

     

     

     

     

     

    创建sheet

    //获取4个区域的商户

       public static InputStream GetRegionShops(double lon,double lat,String filePath) throws ClassNotFoundException, SQLException, IOException, RowsExceededException, WriteException{   

           WritableWorkbook book=Workbook.createWorkbook(new File(filePath));

           String[] sheetNames={"西北区","东北区","西南区","东南区"};

         

              //第i页

         for(int i=0;i<=sheetNames.length-1;i++){

    WritableSheet sheet= book.createSheet(sheetNames[i],i);

    }

     

           book.write();  //book.write如写在循环里面,只创建1sheet

           book.close();    

           System.out.println("Excel输出完成");

           

           InputStream inStream=new FileInputStream(filePath);

           return inStream;

       }

    获取sheet

    book.getSheet(i)

     

    字体

    //字体

              WritableFont wf=new WritableFont(WritableFont.TIMES,10,WritableFont.BOLD);

              WritableCellFormat cf=new WritableCellFormat(wf);

              new Label(0,0,"商户内部编",cf)

            

    设置列宽

     

    WritableSheet.setColumnView(int i,int width);

     

    居中

    WritableFont wf=new WritableFont(WritableFont.TIMES,10,WritableFont.BOLD);

              WritableCellFormat cf=new WritableCellFormat(wf);

              cf.setAlignment(Alignment.CENTRE);

     

     


     

    你可能感兴趣的:(JavaWeb(李兴华著)开发笔记)