一.Tomcat
目录结构:
/bin 开启关闭服务器
/config 各种配置文件
/lib 装有各种jar文件
/work 吧jsp生成的servlet放在次目录下(jsp翻译的文件)
/webapps 当发布web应用时,默认会将web应用的文件存放在次目录中
/logs 日志
/temp 相当于资源中间存放的目录
/WEB-INF 客服端直接访问不到,但是可以跳转访问
二.jsp基础
Jsp的执行过程:
客服端
|1.请求jsp页面
Jsp文件
|2.转换
Servlet文件
|3.编译
Class文件
|4.执行
Servlet实例
|5.返回响应
客户端
三.request与response
<form action="regiseterControl.jsp" method="post">
账号:<input type ="text" name ="userName"><br/>
密码:<input type ="password" name ="pwd"><br/>
爱好:<input type ="checkbox" name ="hibs" value="睡">睡觉
<input type ="checkbox" name ="hibs" value="吃">吃饭
<input type ="checkbox" name ="hibs" value="玩">玩电脑<br/>
<input type ="submit" value ="注册">
</form>
<body>
<%
request.setCharacterEncoding("utf-8");//post方式提交的时候需要用这种方式解决乱码
String name = request.getParameter("userName");
name =newString(name.getBytes("ISO-8859-1"),"utf-8");//get方式提交的时候需要用这种方式解决乱码
String pwd = request.getParameter("pwd");
String[] hib = request.getParameterValues("hibs");
%>
账号:<% out.print(name);%>
密码:<% out.print(pwd);%>
爱好:<%
for(String hibs:hib){
out.print(hibs);
}
%>
</body>
1.
request.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=UTF-8");
2.当cookie中保存中文
<body>
<form action="loginControl.jsp" method="post">
用户名:<input type="text" name ="userName" id ="userName"/><br />
密 码:<input type="text" name ="pwd" id ="pwd"/>
<input type="submit" value ="登录"/>
</form>
</body>
String userName = request.getParameter("userName");
//1.首先编码
userName =URLEncoder.encode(userName,"utf-8");
//2.解码 c为cookie对象
欢迎<%=URLDecoder.decode(c.getValue(),"utf-8")%><br/>
get解决乱码:
String name = request.getParameter("userName");
name =newString(name.getBytes("ISO-8859-1"),"utf-8");//get方式提交的时候需要用这种方式解决乱码
页面之间的跳转
转发:
request.getRequestDispatcher("welcome.jsp").forward(request,response);
特点:
1.地址栏不会发生变化
2.请求的数据可以共享
3.只能在本项目之间跳转
重定向:
response.sendRedirect("welcome.jsp");
特点:
1.地址栏会发生变化
2.请求的数据不可以共享
3.可以任意跳转
cookie: ( 不是jsp的内置对象)
Cookie cook =newCookie("参数",userName);
||
key value
key和value都只能是String类型的
void setMaxAge(int expiry)设置Cookie的有效期,以秒为单位
void setValue(String value)在Cookie创建后,对Cookie进行赋值
String getName()获取Cookie的名称
String getValue()获取Cookie的值
String getMaxAge()获取Cookie的有效时间,以秒为单位
//1.创建cookie
Cookie cook =newCookie("loginName",userName);
Cookie cook1 =newCookie("pwd",pwds);
cook.setMaxAge(60*5);
cook1.setMaxAge(60*5);
//2.写入cookie
response.addCookie(cook);
response.addCookie(cook1);
//3.获取cookie
Cookie[] cooks = request.getCookies();
cookie中存放中文
<body>
<form action="loginControl.jsp" method="post">
用户名:<input type="text" name ="userName" id ="userName"/><br />
密 码:<input type="text" name ="pwd" id ="pwd"/>
<input type="submit" value ="登录"/>
</form>
</body>
request.setCharacterEncoding("utf-8");
String userName = request.getParameter("userName");
String pwds = request.getParameter("pwd");
//cookie保存值
//编码
userName =URLEncoder.encode(userName,"utf-8");
Cookie cook =newCookie("loginName",userName);
Cookie cook1 =newCookie("pwd",pwds);
cook.setMaxAge(60*5);
cook1.setMaxAge(60*5);
response.addCookie(cook);
response.addCookie(cook1);
<%
Cookie[] cooks = request.getCookies();
if(cooks!=null){
for(Cookie c:cooks){
if("loginName".equals(c.getName())){
%>
欢迎<%=URLDecoder.decode(c.getValue(),"utf-8")%><br/>
<%
}
if("pwd".equals(c.getName())){
%>
密码<%=c.getValue()%>
<%
}
}
}else{
response.sendRedirect("index.jsp");
}
%>
session: 一个会话就是一个session 会话就是浏览器,session可以保存对象,取出来的都是object
void setAttribute(String key,Object value)以key/value的形式保存对象值
Object getAttribute(String key)通过key获取对象值
int getMaxInactiveInterval()获取session的有效非活动时间,以秒为单位
String getId()获取session对象的编号
void invalidate()设置session对象失效
application:
类似于系统的全局变量,服务器级别的,用法和session一样
就算浏览器被关闭或者换了浏览器也会继续被共享,只有当服务器关闭之后才会清除.
cookie与session的区别
1.保存范围不一样,cookie保存在客服端,session保存在服务器
2.保存的对象不一样,cookie只能保存字符串,session可以保存对象
3.安全性不一样,cookie不安全,保存一些不重要的数据,session相对安全,保存重要的数据
session与application 的区别:
1.保存的范围不一样,session是浏览器级别的,application是服务器级别的
2.保存的数据不一样,session中保存经常发生变化的数据,application中保存的是系统配置信息或不经常改变的数据
内置对象范围
page范围:在一个页面范围内有效
request范围:在一个服务器请求范围内有效,与客户端请求绑定在一起
session范围:在一次会话中有效
application范围:在服务器内有效
Jsp九大内置对象,不用new就可以直接使用
对象 属于的类型
1.out PrintWrite
2.request HttpServletRequest
3.response HttpServletResponse
4.session HttpSession
5.application ServletContext
6.page Object
7.pageContext PageContext
8.config ServletConfig
9.Exception Throwable
Exception(需要将在jsp页面的page指令中设置为isErrorPage = “true”)
servlet技术
Servlet配置文件说明:
Servlet的配置信息在web.xml文件中,主要通过以下两个步骤进行设置
声明Servlet对象
<servlet>
<servlet-name>FirstServlet</servlet-name>
<servlet-class>com.pxy.servlet.FirstServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>FirstServlet</servlet-name>
<url-pattern>/FirstServlet</url-pattern>
</servlet-mapping>
servlet的声明周期
1.调用构造方法
2.初始化servlet
3.dopost方法和doget方法被调用
4.重新发布或关闭服务器涩女了他会被销毁
1和2只执行一次,3会执行n次
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
<display-name>Web_0907_01</display-name>
<context-param>
<param-name>admin</param-name>
<param-value>950126</param-value>
</context-param>
<servlet>
<servlet-name>FirstTestServlet</servlet-name>
<servlet-class>com.luohao.servlet.FirstTestServlet</servlet-class>
<init-param>
<param-name>ip</param-name>
<param-value>127.0.1</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>FirstTestServlet</servlet-name>
<url-pattern>/FirstTestServlet</url-pattern>
</servlet-mapping>
servlet的写法
privateString ip;
privateString admin;
publicvoid init()throwsServletException{
ip =this.getServletConfig().getInitParameter("ip");
System.out.println("初始化init");
//ServletContext的获得
//第一种
//ServletContext sc = this.getServletConfig().getServletContext();
//第二种
ServletContext sc =this.getServletContext();
admin = sc.getInitParameter("admin");
sc.setAttribute("admin", admin);
}
Filter过滤器
创建一个java实现Filter接口
改接口有三个方法,init方法在服务器加载的时候执行
destroy方法在服务器关闭的时候执行
上面的都只执行一次
doFilter方法会执行n次
过滤器的执行顺序
由web.xml中过滤器配置先后顺序决定的
编码的过滤器
//Filter
publicclassEncodeFilterimplementsFilter{
@Override
publicvoid destroy(){
}
@Override
publicvoid doFilter(ServletRequest request,ServletResponse response,
FilterChain chain)throwsIOException,ServletException{
request.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=UTF-8");
chain.doFilter(request, response);
}
@Override
publicvoid init(FilterConfig config)throwsServletException{
}
}
//xml
<filter>
<filter-name>EncodeFilter</filter-name>
<filter-class>com.luohao.controller.filter.EncodeFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>EncodeFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
Listener监听器
实现单态登录
index.jsp
<body>
<%=
session.getAttribute("msg")==null?"":session.getAttribute("msg")
%>
<%--您好<%=application.getAttribute("admin")%>--%>
<form action="loginServlet" method="post">
<input type="text" name ="userName">
<input type="submit" value ="登录">
</form>
</body>
show.jsp
<body>
欢迎:<%=session.getAttribute("userName")%>
</body>
loginservlet
publicclass loginServlet extendsHttpServlet{
publicvoid doGet(HttpServletRequest request,HttpServletResponse response)
throwsServletException,IOException{
doPost(request, response);
}
publicvoid doPost(HttpServletRequest request,HttpServletResponse response)
throwsServletException,IOException{
response.setContentType("text/html;charset=UTF-8");
request.setCharacterEncoding("UTF-8");
String userName = request.getParameter("userName");
request.getSession().setAttribute("userName", userName);
response.sendRedirect("show.jsp");
}
}
监听器
publicclassSingleListenerimplementsHttpSessionAttributeListener{
privateMap<String,HttpSession> map =newHashMap<String,HttpSession>();
@Override
publicvoid attributeAdded(HttpSessionBindingEvent event){
HttpSession session = event.getSession();
String userName =(String) session.getAttribute("userName");
if(userName !=null){
HttpSession hs =null;
if(map.containsKey(userName)){
hs = map.get(userName);//得到之前的name
hs.removeAttribute("userName");//删除这个session
map.remove(userName);//移除在登录的用户
}
if(hs!=null){
hs.setAttribute("msg","该用户已经在其他地方登陆,被迫下线");
}
}
map.put(userName, session);
}
@Override
publicvoid attributeRemoved(HttpSessionBindingEvent event){
}
@Override
publicvoid attributeReplaced(HttpSessionBindingEvent event){
}
}
拦截器
publicclassLoginFilterimplementsFilter{
@Override
publicvoid destroy(){
}
@Override
publicvoid doFilter(ServletRequest request,ServletResponse response,
FilterChain chain)throwsIOException,ServletException{
HttpServletRequest req =(HttpServletRequest) request;
HttpServletResponse resp =(HttpServletResponse) response;
if(req.getSession().getAttribute("userName")==""||req.getSession().getAttribute("userName")==null){
resp.sendRedirect("index.jsp");
}else{
chain.doFilter(request, response);
}
}
@Override
publicvoid init(FilterConfig filterConfig)throwsServletException{
}
}
xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
id="WebApp_ID" version="3.0">
<display-name>Web_0908_02</display-name>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<filter>
<filter-name>LoginFilter</filter-name>
<filter-class>com.luohao.filter.LoginFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>LoginFilter</filter-name>
<url-pattern>/show.jsp</url-pattern>
</filter-mapping>
<listener>
<listener-class>com.luohao.listener.SingleListener</listener-class>
</listener>
<servlet>
<servlet-name>loginServlet</servlet-name>
<servlet-class>com.luohao.servlet.loginServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>loginServlet</servlet-name>
<url-pattern>/loginServlet</url-pattern>
</servlet-mapping>
</web-app>
EL表达式
el表达式的优点:
1.简便
2.自动类型转换
3.没有值也不会报错
el表达式的语法:
${EL表达式}
和key一样
表达式如果是对象,取对象的属性${key.属性}或者${key['属性']} ,实际上是调用对象的get属性方法
${param.name}获取表单的值
${paramValues.name[0]}获取一组中的值其中的一个
el表达式取值的顺序:
默认顺序:page request session application ${XXXXScope.key}
JSTL标签库
要使用标签库首先需要导入标签库
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<body>
<c:set var="num" value="${100+2}" scope="session"></c:set>
删除之前:
<c:out value="${num }"></c:out>
<c:remove var="num" scope="session"/>
删除之后:
<c:out value="${num }"default="默认"></c:out>
<br />
<c:if test="${num == 100 }" var="result" scope="session">
hahahah
</c:if>
${result}
<br />
<table>
<tr>
<td>年龄</td>
<td>地址</td>
</tr>
<c:forEach items="${adminList}" var="list" begin="0" end="4" step="1" varStatus="status">
<tr <c:if test="${status.index%2==1 }">style="background-color:rgb(219,241,212);"</c:if>>
<td>${list.age }</td>
<td>${list.addr }</td>
</tr>
</c:forEach>
</table>
</body>
若要使用一些别的方法可以导入另外一些标签库
例如需要讲字符串截断的时候
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn"%>
//将Stringparam从0的位置截取到17的位置
${fn:substring(Stringparam,0,17)}
美工做好了html页面,样式什么的都写好了,我想把html页面转为jsp的页面,新建的jsp页面,然后把html的body都复制到jsp页面里,发现原来居中的在jsp页面里不居中了,样式我没变任然是 margin:0 auto; 还有好多图片路径也不对了,关于路径问题我知道,把jsp页面的head里把
<base href="<%=basePath%>">
去掉,但居中问题很苦恼,后来查了下资料,发现把jsp里的dtd改为html的就可以了这样:
把jsp的 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
改为html的 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 这样就可以了。
把jsp的 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
改为html的 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 这样就可以了。