设置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中<Context=false>表示该应用无法获得其他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>404</error-code>
<location>/error404.jsp</location>
</error-page>
<% page method="doPost" %>
<%@ include file="文件绝对URL或相对URL" %> 静态包含,目标可是HTML或JSP,但不能是Servlet
静态导入:1.把多个页面合成一个页面(编译成一个页面),不能有相同的变量。
2.执行效率相对较高
3.通常用户没有java代码页面
4.耦合性相对较高
<jsp:include page="目标的绝对URL或相对URL"/> 动态包含 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注释 <!--aa--->)
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:默认在本页面所有的超链接和路径前面加项目的根路径
<a href="index.jsp">path</a> //http://localhost:8080/Demo/index.jsp
req.getRequestDispather("/").forward(req,resp); //请求转发 "/" 代表项目根路径 http://localhost:8080/Demo/
resp.sendRedirect("/"); //重定向 "/" 代表服务器根路径 http://localhost:8080/
<url-pattern>/index.jsp</url-pattern> // "/"代表项目的根路径
1.相对路径:不能改变文件的相对位置
2.绝对路径:不能修改项目的名称(推荐使用绝对路径)
15.请求转发 动作指令:jsp:forward、jsp:param等只是运行时的动作
<jsp:forward page="目标的绝对URL或相对URL"/> 请求转发之后的代码不会继续执行
特点:执行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 Connection</description>
<res-ref-name>jdbc/bookdb</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-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中通过<listener>向Servlet容器注册。
23.EL表达式:
优点:1.不用导包 2.简洁 3.如果参数没有传过来,则什么都不显示
User里存Address对象
EL表达式:$+{ }
表达式获取参数信息
<li><%=request.getParameter("uname") %></li>
<li><%=request.getParameterValues("fav")[0] %></li>
<li><%=request.getAttribute("realname") %></li>
<li><%=((List<String>)request.getAttribute("list")).get(2) %></li>
<li><%=((Map<String,String>)request.getAttribute("map")).get("CC") %> </li>
<li><%=((User)request.getAttribute("user")).getAddress().getTown() %> </li>
<li><%=((List<User>)request.getAttribute("userList")).get(2).getAddress().getTown() %> </li>
<li><%=((Map<String,User>)request.getAttribute("userMap")).get("user3").getAddress().getTown() %> </li>
EL获取请求参数信息
<li>${param.uname }</li>
<li>${paramValues.fav[0] }</li> getParamter则需要param获取
<li>${realname }</li> getAttribute直接获取属性
<li>${list[2] }</li>
<li>${map.CC }</li>
<li>${user.address.town }</li> address必须与User类中的address大小写一样
<li>${userList[2].address.town }</li>
<li>${userMap.user3.address.town }</li>
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.<c:out value="${ name}" default="zhansgan"> </c:out>
2.<c:set var="name" value="kkk" scope="session"></c:set> //设置参数 ${ sessionScope.name }
3.<c:remove var="name" > ${sessionScope.name } //移除name就找不到值,默认移除全部
4.<c:if test="${sex==1}">男</c:if>
5.<c:choose>
<c:when test="${sex==1}">男</c:when>
<c:otherwise>其他</c:otherwise>
</c:choose>
6.<c:foreach var="aa" begin="1" end="9" step="3"> //类似java中的for
${aa} //每隔3个输出一次
</c:foreach>
<c:foreach items="${list}" var="aa" varStatus="vars" >
${aa}--${vars.first}--${vars.last}--${vars.index} //判断是否是list的第一个元素;index代表下标
</c:foreach>
<c:foreach items="${userList}" var="aa">
${aa.name}--${aa.address.city} address存放于user里的另一个类
</c:foreach>
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位数版本不一致
Tomcat7路径:D:\MainSoftWare\tomcat7\apache-tomcat-7.0.72\webapps\ROOT
taglib definition not consistent with specification version 问题:http://www.ithao123.cn/content-37861.html
23.自定义标签: 继承SimpleTagSupport
TLD:标签库定义
taglib是根元素,一般包含三个元素:
tlib-version:标签库实现的版本
short-name:标签库短名
uri:指定该标签库的唯一标识
tag:包含下列子元素:
name:标签的名称,jsp通过此名称来使用该标签
tag-class:指定标签由哪个处理类来处理。
body-content:指定标签体内容
<taglib xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
version="2.0">
<tlib-version>1.0</tlib-version>
<short-name>SimpleTagLibrary</short-name>
<uri>/jsp2-example-taglib.tld</uri> //tld文件路径
<tag>
<name>MyFirstTLD</name>
<tag-class>com.lzx.MyFirstTag</tag-class>
<body-content>empty</body-content>
</tag>
</taglib>
引用tld: <%@ taglib uri="/jsp2-example-taglib.tld" prefix="first" %>
<first:MyFirstTLD/>
24.定义带属性的标签:
带属性需增加:<attribute>
<name>ddd</name>
<required>true</required>
<fragment>true</fragment>
</attribute>
来源:
https://blog.csdn.net/q2857864700/article/details/56676319