Jsp

一.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>

post解决乱码:
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 />
密&nbsp;码:<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与session,application
cookie: ( 不是jsp的内置对象)
   
   
Cookie cook =newCookie("参数",userName);
||
key value
 
keyvalue都只能是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 />
密&nbsp;码:<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"> 这样就可以了。













  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

翅膀君

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值