部署自己的项目:
https://zhidao.baidu.com/question/511288865.html
配置页面:http://jingyan.baidu.com/article/90bc8fc864699af653640cf7.html
下载页面: http://hsk.oray.com/download/#type=windows|internet
已经部署花生壳的应用: http://linzx2016.qicp.io/MyBookStore/mybookstore.jsp
设置jsp默认pageEncoding;windows->preference->myeclipse->files and editors->jsp->encoding utf-8
设置jsp为编辑模式,没有预览界面:https://zhidao.baidu.com/question/581118605.html?qq-pf-to=pcqq.group
tomcat:多线程,每一个客户都会创建一个新的线程,线程之间互不影响。单例模式
单例模式:
饿汉模式:
优点:确保一个类被调用的时候只创建一个对象,节省时间和内存
缺点:只要加载到这个类,对象就会被创建,会造成资源浪费
懒汉模式:
优点:确保一个类被调用的时候只创建一个对象,只有在调用的时候才生出对象,节省时间和内存
缺点:实现比较复杂
1.Tomcat:免费的开源的轻量级的服务器,中小型企业常用
bin: startup.bat 和startup.sh(linux) shutdown.bat和shutdown.sh
conf: server.xml 服务器配置文件 和 web.xml 项目配置
lib: 常用类库
logs: 运行日志文件
webapps:放置运行的项目
work:放置jsp编译后的class文件
2.Tomcat的lib目录,存放的jar不仅能被tomcat访问,还能被在tomcat上发布的web应用访问。
JavaWeb应用的lib目录下的jar只能被当前web应用访问。
3.打包web应用:
jar cvf e:\TestWeb.war *.*
解包web应用:
jar xvf e:\TestWeb.war *.*
4.Cookie:位于请求头或者响应头
a.浏览器第一次访问服务器,没有cookie,在服务器第一次应答时会对浏览器发送一个cookie.
Cookie mcookie=new Cookie("username","tom");
res.addCookie(mcookie);
b.setMaxAge(0) 指定浏览器删除cookie
setMaxAge(-1) 指定浏览器不保存cookie
c.setPath(path)和setDomain(domain) 控制cookie的读写范围
cookie.setPath("/"); //整个tomcat服务器的应用都能读到
cookie.setPath("/app/"); //只有app应用能读取到
cookie.setDomain("
.cat.com"); //只有域名为 .cat.com的应用能访问到。
7.不同web应用通讯:Tomcat中表示该应用无法获得其他web应用的ServletContext对象
8.避免并发:为保证Servlet能同时相应多个客户的请求,通过为每个请求分配一个工作线程。或者同步代码
9.JSP指令:
1.一个完整的JSP页面是由普通的模板元素(html)、注释元素、指令元素、 脚本元素 、动作元素构成。
2.指令标记、JSP动作标记统称为 jsp标记 。
3.JSP页面的程序片中可以插入 html 标记。
4.当JSP页面的一个客户线程在执行 synchronized 方法时,其他客户必须等待。
jsp在执行过程中经过( 翻译)阶段,由web容器将之转换成java源代码
jsp在执行过程中经过(编译)阶段,会将java源码转换成class文件( b )
特点:
1.Servlet:优点:业务逻辑处理很方便,写java代码
方便
缺点:页面表现麻烦
2.jsp:优点:页面表现方便 //动态网页技术,动态生成网页数据,而不是动态效果的网页
缺点:业务逻辑处理麻烦,
两者通常结合使用。
为什么说jsp是Servlet?
因为jsp页面被访问时会被tomcat编译生成对应的java文件,java文件对应的类继承org.apache.jasper.runtime.HttpJspBase类
而HttpJspBase又继承于HttpServlet.
Jsp的执行过程:
1.客户端发送以 .jsp结尾的请求(url)
2.服务器接收请求后,会进行拦截(tomcat的web.xml),调用JspServlet类,处理jsp文件,生成对应的java文件和class文件(work文件夹下)
3.tomcat会调用生成好的class文件生成html代码,返回给客户端
web.xml关于jsp文件配置
<%@ 指令名 属性="值" %> 常见指令:page include taglib 编译指令,通知Servlet引擎处理消息
errorPage="error.jsp" //只能处理运行时错误,不能处理编译时的错误
web.xml错误处理:
<error-page>
<error-code>404error-code>
<location>/error404.jsplocation>
error-page>
<% page method="doPost" %>
<%@ include file="文件绝对URL或相对URL" %> 静态包含,目标可是HTML或JSP,但不能是Servlet
静态导入:1.把多个页面合成一个页面(编译成一个页面),不能有相同的变量。
2.执行效率相对较高
3.通常用户没有java代码页面
4.耦合性相对较高
动态包含 HTML、JSP(目标响应结果会被加到源组件)或Servlet都可以
无论是静态还是动态包含,源组件和目标组件都共享请求范围内的共享数据。
动态导入:1.分别生成各自的java文件和class文件,互不影响,可以有相同的变量
2.执行效率相对较低
3.通常用在java代码较多的页面
4.耦合性相对较低
不能同一个页面,两次forward,类似servlet
10.声明:
<% ! declar;declar;... %>
<%! int
a=10,b,c; String d="ww"; %> 声明全局变量:不建议使用,因为Servlet中不建议声明全局变量
11.代码段:
<% %>
<%
a++; %>
12.表达式:
<%
=a++%>
13.注释: <%--aaaa--%> 直接不会被编译,其他的注释写在jsp中会被编译(如html注释 )
14.隐含对象:
四大作用域
request:
session:
application:最大作用域,全局共享信息
pageContext:作用域最小,只作用于当前的页面;但可以通过pageContext获取其他八个作用域
out:向客户端发送数据的对象(如html页面代码)
response: jsp中不推荐使用
config:getInitParameter()和getInitParamterValues() 获取servlet的配置信息,但不建议在jsp用
page:
exception:使用<% page isErrorPage='true'%>
路径问题:
服务器根路径: http://localhost:8080/ D:\MainSoftWare\tomcat7\apache-tomcat-7.0.72\webapps
项目根路径: http://localhost:8080/Demo/ D:\MainSoftWare\tomcat7\apache-tomcat-7.0.72\webapps\Demo
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
<base href="<%=basePath%>"> //base:默认在本页面所有的超链接和路径前面加项目的根路径
path //http://localhost:8080/Demo/index.jsp
req.getRequestDispather("/").forward(req,resp); //请求转发 "/" 代表项目根路径 http://localhost:8080/Demo/
resp.sendRedirect("/"); //重定向 "/" 代表服务器根路径 http://localhost:8080/
/index.jsp // "/"代表项目的根路径
1.相对路径:不能改变文件的相对位置
2.绝对路径:不能修改项目的名称(推荐使用绝对路径)
15.请求转发 动作指令:jsp:forward、jsp:param等只是运行时的动作
请求转发之后的代码不会继续执行
特点:执行forward时,用户请求的地址没有发生改变,但是请求的参数、属性不丢失
16.异常页:
<%@ page errorPage="errorpage.jsp" %> 应先声明为异常页<% pageisErrorPage="true" %>
17.预编译:
http://localhost:8080/app/hello.jsp?
jsp_precompile=true
18.JNDI(负责将对象和名字绑定,对象工厂负责生产出对象):
JDBC2.0开始提供javax.sql.DataSource,负责建立与数据库的链接,在程序中访问数据时
不必编写连接数据库的代码,可以直接从数据源中获取数据库连接。
Context:服务端:bind(String str,Object obj); 将对象与一个名字绑定
lookup(String name); 返回指定名字绑定的对象
在META-INF下配置context.xml:
<
Context reloadable="true"
>
<Resource name
=
"
jdbc/bookdb
" auth
=
"Container" type
=
"javax.sql.DataSource"
maxActive="100"
maxIdle="30"
maxWait="10000"
username="root"
password="123456"
driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost:3306/bookdb?autoReconnect=true"/>
Context>
并且在web.xml中配置:
<
web-app
>
<resource-ref>
<description>MYSQLDB Connectiondescription>
<
res-ref-name
>
jdbc/
bookdb
res-ref-name>
<res-type>javax.sql.DataSourceres-type>
<res-auth>Containerres-auth>
resource-ref>
web-app>
public BaseDao() throws Exception{
//引入JNDI对象与名字绑定
Context ctx=new InitialContext();
if(null==ctx)
throw new Exception("No Exception");
ds=(DataSource) ctx.lookup("java:comp/env/jdbc/bookdb");
}
19.session会话:
invalidate(); 销毁当前的会话,Servlet容器释放HttpSession对象占用的资源
cookie机制通常用于保存客户的状态信息,设置最大存活时间后,会保存到浏览器的硬盘,所以要求cookie的属性值必须是可序列化的
Servlet容器创建新的HttpSession:
a.一个浏览器进程第一次访问Web应用中支持会话中的任一个网页。
b.当浏览器与web应用的一次会话已经被销毁后,浏览器进程再次访问web应用中的支持会话的任一个网页。
JSP默认支持会话,HttpServlet默认不支持会话。
response.
encodeURL(url) 会在浏览器不支持会话的情况,使用URL支持会话。
response.sendRedirect(response.encodeRedirectURL("mail.jsp")); 重定向时用
Cookie:
Cookie cookie=new Cookie("name","kkk");
res.addCookie(cookie);
cookie支持中文
发送前先编码:
java.net.URLEncoder.encode("书","utf-8");
接收端解码:
java.net.URLDecoder.decode(cookies[i].getValue(),"utf-8");
20.Tomcat会话管理:
a.StandardManager:标准会话管理器。
b.PersistentManager:更多会话管理功能。
会话存储:
FileStore:将HttpSession对象保存在一个文件中
JDBCStore:将HttpSession对象保存在数据库的一张表中
21.会话监听:
HttpSessionListener和HttpSessionAttributeListener,必须在web.xml中通过向Servlet容器注册。
23.EL表达式:
优点:1.不用导包 2.简洁 3.如果参数没有传过来,则什么都不显示
User里存Address对象
EL表达式:$+{ }
表达式获取参数信息
<%=request.getParameter("uname") %>
<%=request.
getParameterValues("fav")[0] %>
<%=request.
getAttribute("realname") %>
<%=((List)request.getAttribute("list")).get(2) %>
<%=((Map)request.getAttribute("map")).get("CC") %>
<%=((User)request.getAttribute
("user")).getAddress().getTown() %>
<%=((List)request.getAttribute("userList")).get(2).getAddress().getTown() %>
<%=((Map)request.getAttribute("userMap")).get("user3").getAddress().getTown() %>
EL获取请求参数信息
${param.uname }
${
paramValues.fav[0] } getParamter则需要param获取
${realname } getAttribute直接获取属性
${list[2] }
${map.CC }
${
user.address.town } address必须与User类中的address大小写一样
${userList[2].address.town }
${userMap.user3.address.town }
24.EL取值范围:
1.el表达式取值默认从小到大取值(pageContext->request->session->application)
2.pageScope: requestScope:sessionScope: applicationScope:
导入fmt.tld文件
25.
.和[] 访问一个bean属性或者Map entry
. 取值方便,[]功能强大
${user.name } ${user["name"]} ${user[name]}
empty:用来对一个空变量值进行判断:null、一个空String、空Map、没有条目的Collection集合
${ empty name}
+ 作为算术符,加操作(但没有字符串相连的操作)
${1/0} Infinity ${ 1+"a"} 不能显示,结果为NaN ${ 1+"1" } 2
26.JSTL: 替代在jsp中写java代码
主要是get/set/remove 导入
<%@
taglib uri="
http://java.sun.com/jsp/jstl/core
" prefix="s"
%>
1.default="zhansgan">
2.name" value="kkk" scope="session"> //设置参数 ${ sessionScope.
name }
3. ${sessionScope.name } //移除name就找不到值,默认移除全部
4.男
5.
:when test="${sex==1}">男:when>
其他
6.step="3"> //类似java中的for
${aa} //每隔3个输出一次
vars" >
${aa}--${
vars.first}--${vars.last}--${vars.
index} //判断是否是list的第一个元素;
index代表下标
${aa.name}--${aa.
address.city} address存放于user里的另一个类
Session:本质是一个哈希表,哈希表的key就是传递给浏览器的名为jessionid的Cookie值。
当一个值要保存到Session中,须有以下步骤:
(jessionid的Cookie值在浏览器关闭时会自动删除;或者将其MaxAge的值设为-1,也能达到浏览器关闭时自动删除目的)
a.获取jsessionid的值,没有就调用request.getSession()生成
b.得到session对象之后,通过setAttribute()往哈希表中写数据
c.同时还可以通过getAttribute获取该属性值。
fail to load the jni shared library 由于jdk版本与eclipse位数版本不一致
http://jingyan.baidu.com/article/9113f81b0607e42b3214c794.html