Web服务器
是可以向发出请求的浏览器提供文档的程序
提供网上的信息浏览服务
常用的web服务器
Microsoft:IIS 需要基于微软的环境
Apache: Tomact
Oracle: weblogic IBM :websphere 付费商用
Nginx: 稳定性强 ,占用内存少, 并发性强
Tomact 服务器
Apache Jakarta 的开源项目
轻量级应用服务器
开源,稳定,资源占用小
*bin 存放各种平台下用于启动和停止Tomact的脚本文件
*Conf 配置 存放Tomact服务器的各种配置文件
Context.xml
Server.xml 记录服务器启动端口,设置乱码
Lib 存放jar包 Tomact服务器所需的各种jar文件
Logs 存放运行过程中生成日志文件
Temp存放临时文件
*Webapps web程序放在这里 存放web项目
*Work jsp生成的class文件放在这里,缓存文件在程序运行过程中
CTRL+c 快速停止
Tomact注意事项
- Startup.bat 启动后,不许关闭,最小化
- 启动时,窗口一闪而过
Jdk:C:\Program Files\Java\jdk1.8.0_161
通过Tomact部署网站
使用page指令设置页面属性
Jsp 声明和使用变量
使用jsp表达式和out实现页面的输出
理解jsp执行原理
在MyEclipse中如何添加web项目
- Deploy Myeclipse J2EE project to server
部署web应用程序
部署应用程序到tomact的webapps目录
生成war包
修改server.xml
<context path=” 虚拟路径 ” docBase=” 项目工程位置 ”/>(适合一个服务器部署一种web项目)
提示:路径中最好不要包含中文
JSP(JAVA server pages)
运行在服务器端的页面
使用HTML嵌套Java代码实现
工作原理
导入web项目
Import general existing projects into workspace
<% @ Page 指令 语言language import pageencoding %>
HTML 写java代码 使用<% java 代码 %>实现
Out叫做jsp内置对象,无需实例化就可使用
实现数据的显示
Jsp可以添加的注释
HTML注释:<!--HTML注释-->
Jsp注释:<%--jsp注释--%>
Jsp脚本中注释:<%//单行注释%>、<%/*多行注释*/%>
使用<%out.print();%> 实现显示内容 ———— java代码与HTML代码标签混在一起,可读性不好,不利于修改 显示数据来自于数据库
<%=title %>
特殊字符\ 转义
Jsp执行原理
执行过程 调用XXX.jsp文件 到服务器 如果第一次访问这个文件 那么就会生成xxx_jsp.java 然后把它编译成XXX_jsp.class 然后服务器执行
<%! %> 是用作全局的
Web 程序常见错误
404 错误---找不到访问的页面或资源
运行时,URL输入错误
将页面放在WEB-INF下
外部启动Tomact,未部署项目
500错误----jsp页面代码错误
获取数据
Request response
请求对象: request
Public string getParameter(String name)获取参数
示例:
HTML代码: <input type=”text ” name=”userName”>
JSP代码:String userName=request.getparameter(“userName”);
获取同名的多个参数
String[] amillds=request.getParameterValues(“mailld”)
If(maillds!=null&&maillds.length!=0){//循环maillds访问提交的数据}
Else{//未提交与参数mailld相关的数据}
表单提交到JSP,中文乱码问题
不同表单提交的方式,处理方法不同
Post处理:request.setCharcterEncoding(“utf-8”)
Pesponse.setCharcterEncoding()
Get处理:1.治标不治本
String username
byte[] usernames=userName.getBytes(“iso-8859-1”);
Username=new String(usernames,”utf-8”);-
------------>username=new String(userName.getBytes(“ISO-8859-1”),”utf-8”); - 治本方法
配置Tomcat\conf\server.xml文件
URLEncoding=”UTF-8”
Get与post区别
Get post
参数出现在URL中 是 否
长度限制 有 无
安全性 低 高
URL可传播 是 否
在请求中保存属性 public void setAttribute(string name,Object o)
Request.setAttribute(“mess”,”注册失败”)
在请求中获取属性 public Object getAttribute(String name)
在使用属性值的时候要做非空判断,否则会出现控制针异常
它的返回值类型是Object类型,需要做数据类型的转换
转发和重定向
转发:requestDispatcher 对象
Forward() 方法
Request.getrequestdispatcher(“url”),forward(request,response)
通过请求获得一个分发器来跳转到“URL”这个路径下同时携带请求和响应
<jsp:froward page=”url”/>
重定向 将用户请求重新定位到一个新的URL
Response.sendRedirect(“url”)
Request的作用域 :在一次请求的范围内
Request.getcontextpath() 获得上下文路径
转发与重定向的区别
转发 重定向
URL变化 否 是
重新发出请求 不会 会
是否携带请求 是 否
目标URL要求 仅本web应用 任意URL
重定向是客户端的行为,转发是服务器的行为
Request.getparameter 得到参数
重定向想得到参数 处理中文乱码 编码 URLEncoder.encode(String s, “utf-8”)
解码 URLDecoder.decode 获取方
Request对象常用方法
String getparameter(String name) 根据表单组件名称获取提交数据
String[] getParameterValues(String name) 获取表单组件对应多个值时的请求数据
Void setCharacterEncoding(String charset) 指定每个请求的编码
requestDispatcher getRequestDispatcher(String path) 返回一个requestDispatcher对象,该对象的forward() 方法用于转发请求
JSP内置对象已经准备好,可以直接使用
请求对象:request
输出对象:out
相应对象:response
应用程序对象:application setAttribute() 作用域
会话对象:session setAttribute() 作用域
页面上下文对象:pagecontext
页面对象:page :this setAttribute() 只能在当前页面 作用域范围最小
配置对象:config
异常对象:exception
Request
setAttribute() 作用于仅限于一次请求
转发: 服务器内部自动帮用户完成跳转,服务器行为,无形中延长了request作用域
session setAttribute() 作用域
会话 :用户和服务器之间的一次对话过程,
会话可以在多次请求中保存和使用数据
服务端使用的记录客户端状态的一种机制--sessionId 每一个session有一个唯一的sessionID
Session.getID
Session是单用户的多页面可共享的 session数据保存在服务器端
会话的清除和过期
若没有清理机制,会导致性能问题或服务器崩溃
程序主动清除session数据
设置会话失效:session.invalidate();
移除会话的一个属性
Session.removeAttribute(“username”);
服务器主动清除长时间没有再次发出请求的session
设置会话过期时间:
Public void setMaxInactiveInterval(int interval) 单位秒
在web.xml里
<Session-config>
<sesion-timeout>30</session-timeout> 单位分钟
</Session-config>
application setAttribute() 作用域
Cookie:跟踪用户的整个会话 自动填写用户名
Cookie通过在客户端记录信息
本质文本信息
Cookie 以文件方式保存数据
添加数据:public void addCookie(Cookie cookie)
获取数据: public Cookie[] getcookies()
设置有效期:public void setMaxAge(int expiry)
cookie.setPath("/");加上这个表示这个工程对所有可用
Cookie关闭后session里的东西不能用
重写URL来进行
或者文本隐藏域
Cookie最好不要放中文
如果有 先编码 username=URLEncoder.encode(username,”Utf-8”);
再解码 username=URLDecoder.decode(username,”utf-8”);
Application 实现计数器
方法:
Public void setAttribute(String name,Object object);
Public Object getAttribute(String name)
Application 作用于整个作用域
Request session application
相同点:都可以存储属性
不同点:request 中存储的数据仅在一个请求中可用
Session 中存储的数据在一个会话的有效期 针对用户的单用户
Application 中存储的数据在整个web项目中可用
JDBC
JDBC API
实现java程序对各种数据库的访问问
一组接口和类,位于java.sql与javax.sql包
面向接口的编程
JDBC访问数据库步骤
- 加载驱动class.forName()
- 获取connection连接 DriverManager
- 创建Statement 执行SQL语句
- 返回ResultSet查询结果
- 释放资源
Statement与PreparedStatement区别
Preparedstatement 接口继承statement
Statement st=connection.createStatement();
Preparedstatement pstm=connection.prepareStatement(sql);
Sql语句使用“?” 作为数据占位符
使用setXXX() 方法设置数据
preparedStatement预编译
效率,性能、开销 安全性 代码可读性
配置文件 属性文件 properties 是一个键值对的形式
ConfigManger.class.getClassLoader() 这个类的类加载器
getResourceAsStream(configFile) 将配置问键读到一个输入流中
Properties 专门读取属性文件的
InputStream is
Properties.load(is ) properties这个对象用load方法读取到对象中可以根据键来拿值
单例模式
把构造方法私有 程序提供给别人唯一对象
单例模式的两种实现方式
饿汉方式 ------进入这个类里就new一个对象不管调不调用方法
懒汉方式-----当什么时候用我本身的方法的时候在new一个(线程不安全)
解决使用synchronized
public static synchronized ConfigManger getInstance(){
if(configManger==null){
configManger=new ConfigManger();
}
return configManger;
}
使用Tomact访问数据源
分析:访问前需要先获取连接
每次操作结束后,要释放资源
频繁的连接导致系统的安全性和稳定性差
解决:使用数据源和连接池
连接池工作原理:
连接池是由容器提供的,用来管理池中连接对象
数据源DataSource
Javax.sql.DataSource接口负责建立与数据库的连接
由Tomact提供,将连接保存在连接池中
数据源用来连接数据库,获得连接Connection对象
连接池用来管理连接Connection对象
在程序中使用JNDI获取数据源 java 命名数据接口(JNDI)
JNDI---DataSource-----Connection对象
<Resource name=”jdbc/news”
auth=”Container” type=”javax.sql.DataSource” maxActive=”100”
maxIdle=”30” maxWait=”10000” username=”root” password=”root” driverClassName=”com.mysql.jdbc.Driver”
url=”jdbc:mysql://127.0.0.1:3306/kgcnews”/>
当通过JNDI目录接口去寻找一个对应的数据源的时候都要加java:comp/env/+name这个前缀
javaBean
就是一个java类
封装业务逻辑
封装数据
Service包方接口业务逻辑
Dao(接口)-----》DaoImpl接口实现类 :数据库的数据操作
一般一个Dao对应一张数据表
Service与dao层的区别
Dao数据操作,一般一个dao对应操作一张数据表
Service业务逻辑
Service去调用dao
程序结构,每层要做的事情
Dao方接口数据操作 impl 实现类 pojo封装数据javabean util
Service 存放业务逻辑
数据库被dao层调用----》dao层实现类 daoimpl实现---->service调用dao层---》使用实现类serviceimpl-----》页面调用service实现业务逻辑
各个层之间传递数据通过pojo来实现(entity类)
使用脚本与HTML嵌套,页面代码很乱,可读性差,也不易于维护,
Jsp动作标签
通过动作标签,程序员可以在jsp页面中把页面的显示功能部分封装起来,使整个页面更简洁和易于维护
Jsp:useBean
装载一个将在jsp页面中使用的Javabean,发挥java组件重用的优势
<jsp:useBean id=”name” class=”packae.class” scope=”scope”>
Id---javaBean的引用名
class--JavaBean的类
scope--javaBean的范围
Jsp:include
把指定文件插入正在生成的页面中
< Jsp:include page=”url(引入的页面)” > -->动态包含,将被包含页面的结果包含进来(先处理再包含)
<%@ include file=”url” %> --静态包含,将被包含的内容包含进来(先包含再处理)
页面跳转:
Request.getRequestDispatcher().forward()转发
Response.sendRedirect()重定向
<jsp:forward>
<jsp:forward page=”url”> 跳转的页面
CKEditor
网页中实现所见即所得的编辑器
第三方组件
第三方组织提供的组件
使用CKEditor步骤
下载CKEditor
解压到项目中
在页面中加入CKEditor
使用CKEditor编辑内容
提交CKEditor编辑的内容
为新闻添加图片
Commons-fileupload
Htttp://commons.apache.org
Apache公司提供的组件,实现上传功能
实现步骤
下载commons-fileupload-1.2.2.jar和commons-io-2.4.jar导入项目
准备添加新闻的页面,提交至jsp
在jsp中实现文件上传和新闻添加
理解EL特点
使用EL表达式来优化程序代码,增加程序可读性
EL表达式Exception language
${EL表达式}例如:${username}
EL操作符
操作符“.”
获取对象的属性,例如:${news.title}
操作符“[]”
获取对象的属性,例如:${news[“title”]}
获取集合中的对象,例如:newsList[0]
EL严格区分大小写,应严格按规范书写
EL功能
取得JavaBean对象的属性
${news.title}
取得数组、List、Map类型对象的元素
${list[0]}
使用各类运算符对原始数据进行简单处理
${totalRecordcount/pageSize}
屏蔽一些常见的异常
${username}
能实现简单的自动类型转换
${news}相当于(News)request.getAttribute(“news”)
EL访问作用域
Request.setAttribute(“news”,news);
两种方式取数据:
Java小脚本:request.getAttribute(“news”);
使用EL表达式:${news}或者${requestScope.news}
作用域 java代码取值 EL取值
请求作用域 request.getAttribute(“news”) ${requestScope.news}
会话作用域session.-----(“username”) ${sessionScope.username}
程序作用域 application.----(“count”) ${applicationScope.count}
页面作用域pageContext.---(“userNum”) ${pageScope.userNum}
${news}写这个就会从最小作用域进行开始寻找先从页面作用域-请求作用域-会话作用域-程序作用域;或者${requestScope.news}
传递过来的参数使用${param.XX}
JSTL介绍
JSTL JavaServerPages Standard Tag Library
Jsp标准标签库
实现jsp页面中的逻辑控制
JSPL 使用步骤
下载jstl.jar 和 standard.jar包
http://archive.apache.org/dist/jakarta/taglibs/standard/binaries
将这两个包复制到WEB-INF\lib目录
在JSP页面中添加指令
核心的标签
<%@taglib uri=”http://java.sun.com/jsp/jstl/core”prefix=”c”%>
<c:out/> 输出文本内容到out对象,常用于显示特殊字符,显示默认值
<c:out value="${news.title" escapeXml="true"/> }escapexml对特殊字符是否转义
<c:set/> 在作用域中设置变量或对象属性的值
<c:remove/> 在作用域中移除变量的值
<c:if test-放循环条件/> 实现条件判断结构
<c:forEach items-以..循环 var-循环得到的对象 varStatus-循环状态有一个.count用来计数 /> 显现循环结构
<c:url/> 构造URL地址
<c:param/> 在URL后附加参数
<c:import/> 在页面中嵌入另一个资源内容
控制格式标签
<%@taglib uri=”http://java.sun.com/jsp/jstl/fmt”prefix=”fmt”%>
<fmt:fromatDate/> 格式化时间
<fmt:formatNumber/>格式化数字