J2EE基础笔记

版权声明:作者:xp_9512 来源:CSDN 版权声明:本文为博主原创文章,转载请附上博文链接! 原文: https://blog.csdn.net/qq_40981804/article/details/88987541

文章目录

Javaweb—servlet

一、小概念:

  • 字符集:
    1、 gbk:大中华字符集,既包含繁体中文,也包含简体中文
    2、 gbk2312:简体中文字符集
    3、 ISO8859-1:字符串在互联网中传播的默认编码

  • 常见响应错误编号
    404 :未找到资源
    405 :调用方式不对
    500:服务器端发生错误

二、基本概念

1、程序分类

程序分为:单机版应用程序(扫雷,office):
C/S模式应用程序(qq,微信) :必须安装PC客户端软件,运营的成本非常高;Swing技术
B/S模式应用程序(浏览器/服务器):    B/S模式应用程序(浏览器/服务器)

JavaSE:java的基础版java包
JavaEE:java的企业版包含了javax包
JavaME:java的移动版,现在已经不用了

2、一些协议

1、http协议:超文本传输协议

 超文本:音乐,视频,动画,图片,文档,程序,
 默认端口号:80端口

字符串在http中传输采用ISO8859-1编码

2、ftp协议:文件传输协议 默认端口21

3、file协议:本地文件协议

4、url:统一资源定位符(寻找资源)

   url构成:协议+主机地址+端口号+资源虚拟路径+资源名称+查询参数+锚点
   例如:http://www.orcal.com:80/terchers/teacher.jsp?id=101#top
       主机地址:即ip地址映射为域名
       	id=101:查询参数  #top:锚点
		URI:统一资源定位;由资源虚拟路径+资源名称构成

3 、servlet简介

  Servlet是用java语言编写的运行在服务器端的应用程序。他本身是一个java类。它由web服务器加载并执行,可以实现JSP的所有功能。

4 、servlet网关技术

1、在自己创建的网站中新建文件夹WEB_INF在里面新建classes文件夹存java类

2、Javac -d. *.java 命令

       -d:根据类包的路径自动产生目录
        . :在当前目录下创建包 

3、网站配置文件web.xml

在web.xml:配置浏览器端输入index.do,运行index.class程序

 <?xml version="1.0" encoding="UTF-8"?>
<web-app>
    <servlet>
       <servlet-name>index</ servlet-name >//给java类起一个名字可以是类名也可以是别的 
       <servlet-class></ servlet-class >//类文件所在的包和类名
       <init-param>//以键值对的方式存储
               <param-name></param-name>
               <param-value></param-value>  
        </init-param>
    </servlet>
<servlet-mapping>//URL地址到java类之间的映射关系
    <servlet-name> index </ servlet-name >//与前面的名字一样
< url-parttern >/index.do< /url- parttern >//设置客户端的地址栏输入的地址必须添加/
</ servlet-mapping >
<welcome-file-list>//设置默认页面
    			<welcome-file>index.html</welcome-file>
    			<welcome-file>index.htm</welcome-file>
    			<welcome-file>index.jsp</welcome-file>
    			<welcome-file>default.html</welcome-file>
    			<welcome-file>default.htm</welcome-file>
    			<welcome-file>default.jsp</welcome-file>
  	</welcome-file-list>
</web-app>
在这里插入代码片

三、servlet基础

1、Servlet是一个没有main函数的java接口类,存在服务器端,作用是处理客户的请求和响应消息

(1)Servlet起作用的条件:

1、必须实现Servlet接口:通过继承Servlet接口下的HttpServlet实现类来实现servlet接口
2、Servlet需要web.xml配置或者 @WebServlet注解的支持

(2)Servlet的生命周期 面试

1、	servlet的实例化:通过 new关键字,服务器启动的时候进行的实例化
2、	servlet的初始化:通过init()方法,可以手动初始化也可以自动初始化,在第一次请求时进行初始化,只进行一次
3、	服务阶段:doGet()/doPost()/doPut()/doDeleat()方法,通过继承HttpServlet类的servlet接口中的service()方法
4、	销毁阶段:销毁时servlet动调用destory()方法,在服务器关闭的时候逐一进行关闭

(3)Servlet的工作方式(运行原理):单实例 多线程

(4)Get()方法与Post()方法的区别

           1、Get()方法只能承载255个字符的数据量而Post()方法承载的数据量不受限制
           2、Get()方法不安全(地址栏中会出现查询参数)而Post()方法安全
           3、get请求支持临时存储而post不支持
        注意:1、只要含表单就必须用post,能用post就不用get
             2、两种方法都可以携带参数(?参数1&参数2)

(5)servlet配置

          1、Web.xml
          2、注解:@WebServlet (JDK1.6以上,servlet 版本3.0以上)

2、B/S程序模式:以字符串的形式传递消息

浏览器发出请求通过HttpServletRequest接收;服务器有一个监听器时刻监听请求;当服务器接收到请求后通过HttpServletResponse响应浏览器的请求

3、servlet的方法

 1、若servlet中两种请求方法都有,在地址栏上直接输入地址时调用的是doGet()方法。有表单时输入。调用doPost()方法
 2、若servlet中没有doGet()方法,直接输入地址时调用会出现405错误(调用方式不对)
 3、解决出现中文时乱码问题
	1、当用get方法提交表单而且表单中含有中文时会出现乱码,因此每个字符串都需要用Name=New Sring(name.getBytes(“ISO8859-1”),”utf-8”)
	2、当用post方法提交表单而且表单中含有中文时会出现乱码,解决方法:在第一行添加一句  response.setContentType("text/html;charset=utf-8");

4 、HttpServletResponse接口下的方法

ServletResponse 响应接口(父类)对应的HttpServletResponse 响应接口(子类) 
序号 方法 描述
1、 sendRedirect(URL) 重定向:跳转到另一个界面
sendError(404)方法,弹出错误类型
注意:这两个方法不能同时使用
2、 setContentType(“text/html;charset=utf-8”) 设置响应消息内容类型与字符集
3、 getWriter() 获得响应输出流返回一个PrintWriter
一般3和4和5一起用
4、 flush() 清空输出流;
5、 close() 关闭输出流
 理解用户登录时出错执行重定向时客户端发出了两次请求
      第一次请求登录时,由登录界面发出请求,服务器先返回一个消息给客户端告诉用户,用户名或密码不正确;然后由服务器在发出一个响应告诉客户端需要跳转到另一个页面

6、HttpServletRequest接口下的方法

ServletRequest 请求接口(父类)对应的子类HttpServletRequest 请求接口(子类)
ServletRequest是servlet接口的实现类

序号 方法名 描述
1、 setCharacterEncoding(“UTF-8”) 改变请求的字符集编码
2、 getParameter(arg0) 获取客户端发出请求的参数值,返回值是字符串.类型
2.1 getParameterValues(arg0):获 取多个同名的客户端发出请求的参数值,返回是字符串类型的数组
2.2 getParameterNames(arg0) 获取所有客户端发出请求的参数的名字,返回是字符串类型的数组
3、 getRequestURL() 获得完整的客户端请求地址;返回的是stringbuffer
3.1 getRequestURI() 获得URL中的统一资源定位;由资源虚拟路径+资源名称
4、 getServletPath() 获得当前访问的servlet的路径
5、 getRemoteAddr() 获取客户端的IP地址
6、 getRemotePort() 获取客户端的端口号 返回值是int类型
7、 getQueryString()查 看客户端发出请求的查询参数(查询字符串)
8、 setAttribute(String, object) 这个方法在请求中添加一个属性,这个属性可以被其他可以访问这个请求对象的对象(例如一个嵌套的Servlet)使用。
9、 getAttribute(String) 返回请求中指定属性的值,如果这个属性不存在,就返回一个空值。这个方法允许访问一些不提供给这个接口中其他方法的请求信息以及其他Servlet放置在这个请求对象内的数据。
14、 public String getScheme() 返回请求所使用的URL的模式。例如,对于一个HTTP请求,这个模式就是http。
15、 public String getServerName() 返回接收请求的服务器的主机名。
16、 public int getServerPort(); 返回接收请求的端口号。

10、获得当前页面的路径目录

String basePath= request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()
+request.getContextPath()+"/";

四、servlet开发过程中常用接口

一、ServletConfig接口(在init0方法下):servlet配置接口,提高程序的灵活性,方便以后更改

实例化:发出第一次请求时进行实例

方法

1、getInitParameter(key):获得web.xml中的配置参数,若没有返回null
配置参数在配置文件web.xml中,下init-param中配置键值对

    <init-param>//配置初始化参数,以键值对的形式
           <param-name></param-name>
           <param-value></param-value>  
     </init-param>

注意:一组init-param对应一组键值对
2、getServletContext():获得servlet上下文接口实例
默认 Servlet是相互独立的,此方法实现了他们之间的信息共享

二、ServletContext接口:servlet上下文接口,所有Servlet类共享的空间

作用:定义了一个Servlet的环境对象,通过这个对象,Servlet引擎向Servlet提供环境信息。

实例化

1、通过ServletConfig接口下的getServletContext()方法进行实例
2、HttpServletRequest接口下的getServletContext()进行实例化

常用方法

序号 方法名 描述
1、 setAttribute(String,Object) Servlet环境对象中你所指定的对象一个名称(设置全局共享的键值对)
2、 getAttribute(String) 读取键所对应的值,返回值类型是Object
3、 getRealPath(String) 获得网站绝对路径,返回值是字符串(不管是什么原因,如果这一从虚拟路径转换成实际路径的过程不能执行,该方法将会返回一个空值)
4、 remove Attribute(String) 删除键值对

三、RequestDispatcher接口:请求转发接口

作用:一般用来设置某几个Servlet类之间的信息共享;发起请求方,转发请求方,最终接受方法

  定义一个对象, 从客户端接收请求, 然后将它发给服务器的可用资源 (例如 Servlet 、 CGI 、HTML 文件、 JSP 文 件 ) 。Servlet引擎创建request dispatcher对象, 用于封装由一个特定的URL定义的服务器资源。这个接口是专用于封装 Servlet 的,但是一个 Servlet 引擎可以创建 request dispatcher 对象用于封装任何类型的资源。request dispatcher 对象是由 Servlet 引擎建立的,而不是由 Servlet 开发者建立的

实例化

1、用HttpServletRequest接口下的getRequestDispatcher(最终接受方的@WebServlet)方法进行实例化

常用方法

2、用HttpServletRequest接口下的setAttribute(String, object)方法在共享区创建一个属性和属性值
用HttpServletRequest接口下的getAttribute(String)方法:获得请求中的属性值

两个重要方法

1、 include() 包含

public void include(ServletRequest request, ServletResponse response)throws ServletException, IOException

  用来包括发送给其他服务器资源的响应的内容。 本质上来说, 这个方法反映了服务器端的内容。请求对象传到目标对象后会反映调用请求的请求 URL 路径和路径信息。这个响应对象只能调用这个 Servlet 的 ServletOutputStream 对象和 PrintWriter 对象。
   一个调用 include 的 Servlet 不能设置头域,如果这个 Servlet 调用了必须设置头域的方法(例如 cookie) ,这个方法将不能保证正常使 用。作为一个 Servlet 开发者,你必须妥善地解决那些可能直接存储头域的方法。例如,即使你使用会话跟踪,为了保证 session 的正常工作,你必须 在一个调用 include 的 Servlet 之外开始你的 session。

2、 forward(request,response);将请求转发给地址a,执行的代码是最终接受方的,但会隐藏最终接收方的信息
public void forward(ServletRequest request, ServletReponse response)throws ServletException, IOException;

  被用来从这个 Servlet 向其它服务器资源传递请求。当一个 Servlet 对响应作了初步的处理,并要求其它的对象对此作出响应时,可以使用这个方法。当 request 对象被传递到目标对象时, 请求的 URL 路径和其他路径参数会被调整为反映目标对象的目标 URL 路径。如果已经通过响应返回了一个 ServletOutputStream 对象或 PrintWriter 对象, 这个方法 将不能使用,否则,这个方法会抛出一个 IllegalStateException。

四、Http Session接口:会话接口

1、概念:
1、会话:用户通过浏览器与网站服务器之间进行的一系列连续性的交互;一段会话的默认时间30分钟.
       服务器会为每一个会话分配不同的会话id,会话用于跟踪识别用户的身份
2、http的无状态性的特征:可以理解为健忘(无法记录用户访问的身份)
3、Cookie:是浏览器中的一种存储机制,用来存储服务器发送给客户端的一小段消息,其中就包括会话id号
4常用的会话跟踪技术:cookie(最常用的)、url重写(将会话id号附加到url中)、 隐藏表单域(<input type=”hidden” value=”绘画id”>)、SSL安全套接字层
2、实例化

用HttpServletRequest接口下的getHttpSession()方法进行实例化

3、常用方法

getId():获得会话的id号
getCreationTime():会话开始的时间,返回值是long
getLastAccessedTime():最近一次的访问时间
isNew():判断会话是否为新会话

jsp

一、 基本概念

html:(静态页面)在浏览器中运行
jsp:(动态页面)java servlet page的简称,在服务器上运行

1、	jsp要存放在web content根目录下
2、	<%@......%>  :jsp指令,在服务器中运行,客户端看不见jsp代码,起到保护性作用
<%@ page language="java" contentType="text/html; charset=ISO-8859-1" 
pageEncoding="ISO-8859-1"%>
 解释:  
       1、language:编程语言(必须是java 可去除) ;
       2、contentType :文本类型;charset设置字符集
                    修改默认字符集,window—preference—搜jsp—jspfiles—Encoding(选择utf-8)
       3、pageEncoding:设置字符集(必须与meta标签的charset保持一致 可去除)
       4、import=”java….”:相当于java代码中的导包
        5、errorException=”处理异常的页面的地址”:当产生异常时跳转到相应的页面
3、 <%=表达式%>:jsp的表达式,计算表达式并输出结果,(每一表达式都不必须带分号)或者变量值的输出, <%...%>:jsp脚本,进行逻辑控制(每一句java代码都必须带分号) 
4、	httpjspbase是httpservletbase的子类

二、jsp页面执行过程与原理

1、过程:

1、转译:jsp文件---java文件
2、编译:java文件---class文件
   在tomcat的工作根目录work,找到工作的网站下一直到最里面可以找到转译与编译文件
3、实例化:将java类使用new构造方法实例化
4、初始化:init()方法
5、服务:service(request,reponse)
6、销毁:destory()

2、原理与servlet一样

三、JSP页面构成元素

1、静态html元素
2、<%@jsp指令%>
3、<%=jsp表达式%>
4、<%jsp小脚本%>
5、<%!jsp方法声明%>:定义java方法
   <%=方法名()%>:调用带有返回值的java方法
6、<jsp: jsp标准动作/>
7、<%--jsp注释--%>java服务器端注释  <!--HTML注释--> html客户端注释;

四、jsp的指令

1、page指令:作用范围整个JSP页面

  常用的属性:
           contentType : 表示MIME类型,它是一种多功能的internet邮件扩充协议。
               设定MIME后,浏览器会自动使用指定应用程序来打开。常见的MIME类
               型有超文本标记语言 text/html 、普通文本text/plain 、GIF图形 image/gif 等
           charset:表示jsp页面的编码方式
           import:表示需要导入的java类包

2、include指令:实现页面相互包含(将多个jsp合并为一个jsp)一般是网页的头部和尾部

<%@ include file=”rerlativeURL”%>
 其中rerlativeURL,表示该file的相对路径。它一般引入的是一个文件,该文件的属性值一般不允许是一个变量。在实际的项目中,一般将多个页面的共同内容放到一个文件中,然后在其它页面中引入该共通文件。

注意:每张页面的jsp该有的定义指令都必须有

例如:将网站中所有网页的头部放进top.jsp中:(只含有html标签和body标签的前一半)

 <%@ page  pageEncoding="UTF-8"%> 
<!DOCTYPE html >
<html>
	<head>
		<meta charset="UTF-8">
		<title>标签库的练习</title>
	</head>
<body>
   		<h1>我的第一个标签库(头部)</h1>
          将网站中所有页面的后半部分放进bottom.jsp中(只含有html标签和body标签的后一半)
  		 <%@ page  pageEncoding="UTF-8"%>
 		  <h1>页面的底部</h1> 
</body>
</html>
            定义网页中间的部分,利用include指令
<%@ page contentType="text/html; charset=utf-8" pageEncoding="UTF-8"%>
<%@ include file="Top.jsp"%>
  <h1>我是主要内容</h1>
<%@ include file="bottom.jsp"%>

3、taglib指令:导入第三方的标签库

MVC设计模式:要求view中尽量少的出现<%%>
JSTL标签库:jsp标准标签库(sun公司提供)用来实现条件判定和循环处理等
若想引用标签库需要下载jar包,拷贝到webinf的lib目录下

<%@ taglib uri=”jar包的地址”  prefix=”c”%> 
        uri:导入标签所在的位置,例如
        prefix:定义前缀

五、JSP隐式对象

隐式对象:每jsp都带有的隐含输出流,直接使用

输入输出对象:
   1、	out :response.getWriter 
   2、	request:HttpServletRequest
   3、	response:HttpServletReponse
作用域对象:
   4、	page:pageContext             页面作用域,作用域当前页面
   5、	session:HttpSession        会话作用域,作用域整个会话的页面
   6、	application:ServletContext 应用程序作用域,作用域整个程序
异常对象
   7、	exception:在jsp指令的page属性里面加上isErrorPage=”true”表示该页面是错误处理页面
servlent对象
   8、	page:this 当前页面
  9、	config:ServletConfig  

六、jsp的作用域

1、	page:页面作用域,作用域当前页面
2、	request:    请求作用域,作用域为指定的包含请求转发几个页面;在请求完成时结束
3、	session:    会话作用域,作用域整个会话的过程
4、	application: 应用程序作用域,作用域整个的客户端用户

注意application下的getRealPath方法获得当前网站的绝对路径

七、JSTL标签库:JSP标准标签库

 标签库的目的是为了取代jsp中的<%%>,方便html的管理,
 若想使用JSTL标签库,需要导入javax.servlet.jsp.jstl.jar和jstl-impl.jar两个jar包,可以从网上下载

1、${el表达式}:jsp2.0专家组+JSTL专家组

关键字:【pageScope ,requestScope, sessionScop, applicationScop】指定作用域

1、${el属性名}用于访问作用域中的属性值(在没有指定作用域时,按作用域的由小到大进行取值)
2、用于实现各种类型的计算
3、用于读取请求参数
4、关键字:param相当于parameter,获取请求中的参数

2、core标签库:tstl核心标签库

1、标签分类

通用标签:若没有指定作用域的情况下默认是page
  • set标签:在指定作用域中设置属性及属性值
       <c:set var=”money”  value=”100” scope=”键值对的作用域”/>
  • remove标签:从指定作用域中删除属性
           <c:remove var=”money” scope=”键值对的作用域”/>
条件标签
  • if标签:<c: if test=”${}”> 语句</c:if>

     test:条件;当条件成立时执行语句
    
  • choose标签:相当于switch—case。。default语句

    <c:choose>
        	<c: when  test=”条件”> 语句</c:when>
         	….
        	<c:otherwise>  语句</ c:otherwise >
    </c:choose>
迭代标签
  • 1、 拆分字符串
    <c:forTokens  begin=”索引值”  items=”字符串” delims=”拆分标识符1拆分标识符2” var=”存放拆分好的小字符串”  step=”2” end=”索引值”>
    </c:forTokens >
	     begin=”索引值”:从哪开始截取
	     end=”索引值”:到哪结束
	     step=”2”:设置隔一个取一个
  • 2、 数组和集合的遍历
	  <c:forEach  items=””  var=”定义存放数组元素的变量” varStatus=”变量”>
	       ${变量}//取出变量的值
	</c:forEach>
	   items=””:用${}定义数组或集合的位置
	   varStatus=”变量”:统计循环的次数
注意:此时变量是一个对象,用变量名.index读取index属性即循环次数 ### 3、FMT(I18N)标签库:用来实现国际化和日期处理 1、使用时必须先引用core核心标签库,再引用fmt标签库 ##### 日期处理
  • 1、 formatDate标签:<fmt: formatDate value=”${ }” type =””>
    根据浏览器默认的语言,来设置日期格式  
      type =””: data:只显示日期(默认)
              time:只显示时分秒
              both:显示日期和时分秒
数字处理
  • 1、 formatNumber标签:<fmt: ormatNumber value=”${ }” type =””>
根据浏览器默认的语言,来设置日期格式  
      type =””:currency(货币)

实现智能国际化处理:

   1、前期准备:
     将jsp文件中的文本以中文和英文的方式分别存在相应的语言包中
     在src目录下新建两个file(语言包),分别命名为:words_en.properties和 words_zh.properties
       words_en.properties:存放英文
       words_zh.properties:存放中文所对应的unicode码(eclipse自动转码)
      注意:语言包中的变量是以键值对的形式存在
  2、网页中
    在jsp开头前 <fmt: setBundle   basename=”wrods” var=”bd”>
           注意:basename中为两个语言包包名中下划线之前的名字     
    在文本处使用:<fmt: message  bundle=”bd”  key=”键名 ”>
    设置在页面显示的中英文
     <fmt: setLocale value=””>其中value等于zh-CN时是中文,等于 en-US英文
     敲门:一般不宜吧value写死,可以在页面中设置一个指向自身的超链接,传递参数,其值是zh-CN或者en-US,然后在value中使用${param.参数名}

九、servlet与jsp的通信

   利用RequestDispatcher 接口:请求转发接口
   请求转发接口:RequestDispatcher rd = request.getRequestDispatcher("kind.jsp");//转发目的网址
			  request.setAttribute("kind", kind);//转发的数据
		      rd.forward(request, response);//开始转发

十、mvc与项目开发

1、基本概念

MVC是一种软件设计模式,该模式实现了表示画面的代码和实现逻辑的代码的分离。使应用程序可以根据不同的需要使用不同的表现形式。

  • M:Model- JavaBean数据模型(访问数据库)
    主要负责业务流程和状态的处理。它可以接受视图发出的请求数据,并将处理后的结果返回给视图。model可以通过更新view的数据来反映数据的变化。model中的代码可以被多个视图重复利用,提高了代码的重复性。model是mvc的核心

  • V:View-jsp数据的展示
    是用户看到并与之交互的界面。它只负责对视图上数据的采集和处理以及用户的请求,在视图中不需要处理有关业务逻辑的内容。视图只是作为一种输出数据并允许用户操纵的方式。

  • C:Control-Srevlet程序流程控制
    定义用户界面对用户输入的响应方式,主要用于管理模型和视图之间的交互控制。它只负责接受用户的请求并决定用什么样的模型去处理该请求,并将模型处理后的数据返回给符合要求的视图显示。控制器本身不会对业务逻辑做任何处理

扩展: 在MVC中,多个视图可以共享一个数据模型,一个视图也可以对应多个模型。其中JSP+Servlet+JavaBean(EJB)就是一种符合MVC 设计模式的开发方式。目前比较流行的MVC开发框架还有Struts , Spring , Struts+Spring+Hibernat。在Struts+Spring+Hibernate框架中Struts用于表示层,Spring用于业务逻辑层,Hibernat用于持久层,这三个框架的整合能够很好的提高程序的开发效率。

2、MVC的处理过程

在使用JSP进行开发时,Servlet可以认为是一个控制器,负责处理画面发出的请求,决定使用哪一个javabean对象,以及将结果发送给哪一个JSP画面。javabean用于model层,主要负责业务处理和数据库的连接等操作,JSP主要负责画面的显示、视图中数据的采集和处理以及用户的请求。

首先Servlet控制器接受浏览器发出的request请求,并决定应该调用哪一个javabean来进行处理。然后javabean负责与数据库的连接和数据的存储并根据不同的业务逻辑来处理用户的请求,再将处理后的数据返回。最后Servlet控制器将数据返回给浏览器,通过表示层呈现给用户。

3、使用MVC 的原因

1、高重用性 2、低耦合性 3、可维护性 4、有利于软件工程化管理

4、项目开发

瀑布模型,快速模型,v字模型

开发技巧

十一、文件的上传与下载(以照片为例)

1、 方式:

1、在数据表中直接存放照片,缺点会使数据表变得很大,所以常用第二种方法
2、在数据表中存放照片所在位置的路径(数据库中的数据类型为字符型)

2、jsp的from表单中

使用上传域< Inpurt type=” file”上传域 > 上传文件 默认一次一个
Multiple=” Multiple” 上传多个文件
同时在from中添加属性:enctype=”multipart/from-data” 使文本域生效
表单中enctype="multipart/form-data"的意思,是设置表单的MIME编码。默认情况,这个编码格式是application/x-www-form-urlencoded,不能用于文件上传;只有使用了multipart/form-data,才能完整的传递文件数据

3、上传文件的原理:

在这里插入图片描述
将文件由客户端浏览器中上传到服务器上

4、part接口:servlet3.0提出来的一个用于文件上传的类

     Part接口,表示允许接收MIME类型是multipart/form-data类型的POST请求

构造方法:

  • 1、Part part = request.getPart(“photo”);
  • 2、Collectionparts = request.getParts();//获得多个文件,返回part对象的集合

方法:

  • 1、getHeader(参数):获得该part请求的头部
 Content-Disposition: form-data; name="upload"; filename="readme.txt" 
 参数”content-disposition”:获得form-data; name="picture"; filename="5a4e446a3a06b358.jpg"

一个请求包括头部和主体,主体就是servlet中能看见的代码,而头部我们看不见的

在HTTP请求中,第一行必须是一个请求行(request line),用来说明请求类型、要访问的资源以及使用的HTTP版本。紧接着是一个首部(header)小节,用来说明服务器要使用的附加信息。在首部之后是一个空行,再此之后可以添加任意的其他数据[称之为主体(body)]

  • 2、part.getInputStream();// 获得path对象的输出流

  • 3、getName():获得表单元素的name属性值(基本上用不到)

5、servlet中的设置

1、添加注解:用于文件上传的专用注解

     1MB=1024KB=1024*2 BYTE
   @MultipartConfig( 参数 ):表示当前Servlet符合MIME类型的multipart/form-data
         maxFileSize=1024:设置单个文件大小的最大值为1024byte(long型,以字节为单位),赋值时支持运算
       maxRequestSize =1024:设置多个上传文件大小总和的最大值为1024K
       fileSizeThreshold:设置缓存的大小,当文件超出这个大小时会生成临时文件
       location:用于设置上传文件在服务器上临时保存的路径

2、获取文件的part对象:

String photo=request.getParament(“photo”)//从请求中获得photo
Part part = request.getPart(“photo”);//获得单个文件,返回part对象
Collectionparts = request.getParts();//获得多个文件,返回part对象的集合

3、获得文件在本地的名字为input做准备

      String dis=part.getHeader(“content-disposition”);//获得请求的头部
        经过字符串的剪切与替换获得文件电脑中的名字
         String ps[] = dis.split(";");
			String p = ps[2];
			String s = p.split("=")[1];
			s = s.replaceAll("\"", "");//替换里面的引号

4、创建输入/输出流上传文件

            InputStream is = part.getInputStream();//将本地文件上传至浏览器
            file file=new file(“E://photo”)//定义照片所要保存的目录

OutputStream os = new FileOutputStream(file+s)//将浏览器的文件上传至服务器

5、解决一些问题

1、时间戳算法

时间戳算法可以精确到毫秒级别,给上传文件重新命名一个时间戳从而解决上传文件名相同时被覆盖的问题
实现步骤:上传时的操作

String ext = s.substring(s.lastIndexOf("."));//获得文件的后缀名
long t = System.currentTimeMillis();//获取时间戳
String filename = t+ext; //获得新的文件名=时间戳+后缀名 

获取时间戳的三种方法:

//方法 一
System.currentTimeMillis(); 最快
//方法 二
Calendar.getInstance().getTimeInMillis(); 最慢
//方法 三
new Date().getTime(); 
2、path变量

直接找到网站根目录所在服务器的路径,解决了一些服务器不同系统磁盘不存在的问题

String path = request.getServletContext().getRealPath("/photos/");//获得网站中photos目录的绝对路径
   得到:E:\javaee\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\tstl\images\

6、综合例子

     //获取网站发布的绝对路径
      String path = request.getServletContext().getRealPath("/photos/");
		//获得part对象
		Part part = request.getPart("photo");
		if(part!=null && part.getSize()>0){  //保证path存在且不为空
           //获取原始文件扩展名
			String dis = part.getHeader("content-disposition");
			if(dis!=null && !"".equals(dis)){  //保证获得请求头部存在且不为null
				String ps[] = dis.split(";");
				String p = ps[2];
				String s = p.split("=")[1];
				s = s.replaceAll("\"", "");
				//时间戳算法,解决覆盖问题
				String ext = s.substring(s.lastIndexOf("."));
				long t = System.currentTimeMillis();
				String filename = t+ext;
                //建立输入输出流
				InputStream is = part.getInputStream();
				OutputStream os = new FileOutputStream(path+filename);
				byte[] b = new byte[512];
				while(is.read(b)!=-1){
					os.write(b);
				}
				is.close();
				os.flush();
				os.close();
               //插入到对象中
				bean.setPhoto("photos/"+filename);//使用修改的照片
			}
		}else{
			String photo = request.getParameter("pic");//使用原来的照片
			bean.setPhoto(photo);
		}	

十三、文件的下载

1、

十四、组合查询

利用jQuery与Ajax实现

1、简化底层DAO开发

  原理:利用IO流
  artifact.jar:使用properties方法,将此包引入项目中,以Java 应用程序的方式运行,在弹出对话框中选择就可以
   POJO:bean对象  持久层代码:DAO类  业务层代码:bizs
  存储设置:设置存储路径

2、实现

     1、写一个jsp页面,填写查询的所有条件,并将数据传到servlet上
     2、在servlet中接受条件,并封装为map集合,并传到相应的dao中
     3、在dao中获取传过来的参数,当参数不为空时,进行SQL语句的拼接(注意在后面加一个逻辑为真的式子)

十五、分页显示

需要知道的数值

1、	在sql语句中利用(limit 从哪一行开始,查询多少行)来设置每页显示多少行
2、	数据表中一共有多少条记录 select count(*)  from student
3、	来算出一共需要多少页

如何做:

1、	当前页码:string page
2、	每页显示的行数:string rows
3、	则起始记录数为:(page-1)*rows

十六、MD5密码加密

1、	不可逆加密,加密位数可以分为32位、64位、128位
2、	将密码转换为32位16进制的密码
3、	MD5是一个Java类,调用里面的md5crypt()方法,传入一个密码,将产生一个32位的16进制数

十七、图片验证码

目的:为了防止暴力破解,给尝试破解造成一些障碍
用法: 在页面特定的位置加一个img标签:其中src=”image.jsp”,点击图片切换验证码,并将产生的验证码传到session会话中
1、 验证码在背景加线条是为了防止一些图片识别软件
2、 点击图片换一个验证码,利用js,设置点击重新加载src=”image.jsp?code=”match.random()

猜你喜欢

转载自blog.csdn.net/qq_40981804/article/details/88987541