JSP基础知识

一、JavaWeb简介

1、C/S:在服务器中主要是一个数据库,所有的业务逻辑以及界面都交给客户端完成

B/S:基于浏览器访问的应用

 

2、静态网页:Web页面中供人们浏览的数据始终不变

动态网页:数据由程序产生

 

3、WEB-INF的目录结构:

WEB-INF是Java的Web应用的安全目录。安全是指客户端无法访问,只有服务器端可以访问。

1)web.xml,项目部署文件

2)classes文件夹,用以放置*.class文件

3)lib文件夹,用于存放需要的jar包。

 

 

 

二、JSP基础语法

1、Jsp指令

1)page指令 通常位于jsp页面的顶端,同一个页面可以有多个page指令

2)include指令 将一个外部文件嵌入到当前jsp文件中,同时解析这个页面中的Jsp语句

3)taglib指令 使用标签库定义新的自定义标签,在Jsp页面中启用定制行为

<%@ page 属性1=“属性值” 属性2=“属性值”%>//@和page中间有一个空格

 

2、Jsp注释:

HTML的注释:

<!--html-->    //客户端可见(查看源文件)

Jsp的注释:

<%--html--%>    //客户端不可见

Jsp脚本中的Java注释:

//单行注释  /**/多行注释     //客户端不可见

 

3、Jsp脚本

在Jsp页面中执行的java代码,<%代码%>

例如:<%out.print("大家好") ;%>

 

4、Jsp声明

在JSP页面中定义变量或者方法,<%!Java代码%>

例如:

<%!
        String s="张三";
        int add(int x,int y)
        {
            return x+y;
        }

%>

 

5、Jsp表达式

在Jsp页面中执行的表达式,<%=表达式%>  //注意:表达式不已分号结束

例如:

<%=s %>

x+y=<%=add(10,5) %>

打印九九乘法表

<h1>打印九九乘法表</h1>
    <%! 
    	//使用表达式
    	String printMultiTable1(){
    		String s="";
    		for(int i=1;i<=9;i++){
    			for(int j=1;j<=i;j++){
    				s+=i+"*"+j+"="+i*j+"&nbsp&nbsp&nbsp&nbsp";
    			}
    			s+="<br>";
    		}
    		return s;
    	}
    %>
    <%!
    	//使用Jsp脚本
    	void printMultiTable2(JspWriter out) throws Exception{
    		for(int i=1;i<=9;i++){
    			for(int j=1;j<=i;j++){
    				out.print(i+"*"+j+"="+i*j+"&nbsp&nbsp&nbsp&nbsp");
    			}
    			out.print("<br>");
    		}
    	}
     %>
    <%=printMultiTable1() %>
    <br>
    <%printMultiTable2(out); %>
    <br>

 

 


三、JSP内置对象

1、JSP九大内置对象

常用:out、request、response、session、application对象

另外还有Page、pageContext、exception、config等

 

2、out对象

out对象是JspWriter类的实例,是向客户端输出内容的常用对象。

常用方法如下:

void println()  向客户端打印字符串

void clear()  清除缓冲区内容,如果在flush之后调用会抛出异常

void claerBuffer()  清除缓冲区的内容,如果在flush之后调用不会抛出异常

void flush()  将缓冲区内容输出到客户端

void getBufferSize()  返回缓冲区以字节数的大小,如不设缓冲区则为0

void getRemaining()  返回缓冲区还剩多少可用

boolean isAutoFlush()  返回缓冲区满时,是自动清空还是抛出异常

void close()  关闭输出流

 

3、请求方式:GET、POST,共8种请求方式(HEAD、PUT、DELETE)。

GET请求和POST请求的区别

GET请求用于获取数据,能在地址栏看到,不安全,大小受限制,不支持二进制流。搜索、查询等

POST请求主要是为了将数据传到服务器端,支持二进制流。注册、修改、上传等

 

4、request对象

是HttpServletRequest类的实例

String getParameter(String name)  返回name指定参数的参数值

String[] getParameterValues(String name)  返回包含参数name的所有值的数组

void setAttribute(String,Object)  存储此请求中的属性

void getAttribute(String name)  返回指定属性的属性值

String getContentType()  得到请求体的MIME类型

String gteProtocol()  返回请求用的协议类型及版本号

String getServerName()  返回接受请求的服务器主机名

例如:

login.jsp

  	<h1>用户登录</h1>
  	<hr>
    <form action="doLogin.jsp" name="loginForm" method="post">
    	<table>
    		<tr>
    			<td>用户名:</td>
    			<td><input type="text" name="userName"></td>
    		</tr>
    		<tr>
    			<td>密码:</td>
    			<td><input type="password" name="passWord"></td>
    		</tr>
    		<tr>
    			<td>爱好:</td>
    			<td>
    				<input type="checkbox" name="favorite" value="read">读书
    				<input type="checkbox" name="favorite" value="music">音乐
    				<input type="checkbox" name="favorite" value="movie">电影
    				<input type="checkbox" name="favorite" value="internet">上网
    			</td>
    		</tr>
    		<tr>
    			<td colspan="2"><input type="submit" value="登录"></td>
    		</tr>
    	</table>
    </form>
    <a href="doLogin.jsp?userName=李四">URL传参</a>

doLogin.jsp

<%
  	request.setCharacterEncoding("utf-8"); //解决中文乱码问题,无法解决URL中文传参问题
  %>
    用户名:<%=request.getParameter("userName") %><br>
    爱好:<%
    if(request.getParameterValues("favorite")!=null){
	    String[] favorite=request.getParameterValues("favorite");
	    for(int i=0;i<favorite.length;i++)
	    	out.print(favorite[i]+"&nbsp");
    }
    %> 

URL中文传参乱码问题在server.xml中修改

    <Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" URIEncoding="utf-8"/>

在最后加上URIEncoding="utf-8"

 

5、response对象

https://i-blog.csdnimg.cn/blog_migrate/134574be8aac51c8a6113ccb74a5fc0c.png

response对象通过getWriter()获得的对象在打印时提前于out对象。

请求重定向:例如<%response.sendRedirect("login.jsp"); %>

https://i-blog.csdnimg.cn/blog_migrate/731e6cf9da5acc0cf1d61b45da66dc65.png

请求重定向

login.jsp

<h1>用户登录</h1>

        <hr>

    <form action="response.jsp" name="loginForm" method="post">

        <table>

               <tr>

                       <td>用户名:</td>

                       <td><input type="text" name="userName"></td>

               </tr>

               <tr>

                       <td>密码:</td>

                       <td><input type="password" name="passWord"></td>

               </tr>

               <tr>

                       <td>爱好:</td>

                       <td>

                               <input type="checkbox" name="favorite" value="read">读书

                               <input type="checkbox" name="favorite" value="music">音乐

                               <input type="checkbox" name="favorite" value="movie">电影

                               <input type="checkbox" name="favorite" value="internet">上网

                       </td>

               </tr>

               <tr>

                       <td colspan="2"><input type="submit" value="登录"></td>

               </tr>

        </table>

    </form>

    <a href="doLogin.jsp?userName=李四">URL传参</a>

response.jsp

<%response.sendRedirect("doLogin.jsp"); %>

doLogin.jsp

<%

        request.setCharacterEncoding("utf-8"); //解决中文乱码问题,无法解决URL中文传参问题

  %>

    用户名:<%=request.getParameter("userName") %><br>

    爱好:<%

    if(request.getParameterValues("favorite")!=null){

            String[] favorite=request.getParameterValues("favorite");

            for(int i=0;i<favorite.length;i++)

                out.print(favorite[i]+"&nbsp");

    }

    %>

https://i-blog.csdnimg.cn/blog_migrate/2b58b5c73605d32cb507445161151722.png

请求转发:

response.jsp

<%request.getRequestDispatcher("doLogin.jsp").forward(request, response); %>

https://i-blog.csdnimg.cn/blog_migrate/d35130d00f9e817049beee5974f41154.png

 (地址栏,能不能获得用户名和爱好)

 

6、session对象

在服务器的内存中保存着不同用户的session

例如:

session1.jsp

  	<% 
  		SimpleDateFormat sdf=new SimpleDateFormat("yyyy年MM月dd日");
  		Date d=new Date(session.getCreationTime());
  		String s=sdf.format(d);
  		session.setAttribute("userName", "王五"); 
  		session.setAttribute("passWord", "123123"); 
  		session.setAttribute("age", 24); 
  	%>
  	<%=s %>
  	<br/>
    <%=session.getAttribute("userName")  %>
    <br/>
    <%=session.getId() %>
    <br>
    <a href="Session2.jsp" target="_black">跳转到session2.jsp页面</a>

 session2.jsp

    <%=session.getAttribute("userName") %>
    <br>
    <%=session.getId() %>
    <br>
    <%
    	String[] values=session.getValueNames();
    	for(int i=0;i<values.length;i++)
    		out.print(values[i]+"&nbsp&nbsp");
    %>

session生命周期:创建、活动、销毁 

 

 

7、application对象

例如:

    <%
		application.setAttribute("name", "李四");
    	application.setAttribute("city", "BeiJing");
    	application.setAttribute("sex", "male");
    %>
    <%=application.getAttribute("name")%>
    <br>
    <% 
    	Enumeration  a=application.getAttributeNames();
    	while(a.hasMoreElements())
    		out.print(a.nextElement()+"&nbsp;&nbsp;");
    %>
    <br>
    <%=application.getServerInfo() %>

 

8、page对象

 

9、pageContext对象

 

10、Config对象

 

11、Exception对象

例如:

exception_test.jsp

<%@ page language="java" import="java.util.*" pageEncoding="utf-8" errorPage="exception.jsp"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
  </head>
  
  <body>

<%
    	System.out.println(100/0);//控制台输出
    	//out.print(100/0); //页面输出
%>
  </body>
</html>

exception.jsp

<%@ page language="java" import="java.util.*" pageEncoding="utf-8" isErrorPage="true"%>
<html>
  <head>
  </head>
  
  <body>
    <%=exception.getMessage() %>
    <br>
    <%=exception.toString() %>
  </body>
</html>

 

 

 

四、JavaBean

1、JSP动作元素

 

2、<jsp:useBean>

项目src下新建一个com.po包,包内新建一个Users.class。

package com.po;

public class Users {
	private String userName;
	private String password;
	
	public Users(){}

	public String getUserName() {
		return userName;
	}

	public void setUserName(String userName) {
		this.userName = userName;
	}

	public String getPassword() {
		return password;
	}

	public void setPassword(String password) {
		this.password = password;
	}
}

WebRoot下的userBean.jsp

    <jsp:useBean id="myUser" class="com.po.Users" scope="page"></jsp:useBean>
    用户名:<%=myUser.getUserName() %><br>
    密码:<%=myUser.getPassword() %>

得到的用户名和密码是空值,需要通过<jsp:setProperty>设置

 

3、<jsp:setProperty>

前三种

com.po下的Users.class见上

login.jsp

<h1>用户登录</h1>
  	<hr>
    <form action="javabean/dologin.jsp" name="loginForm" method="post">
    	<table>
    		<tr>
    			<td>用户名:</td>
    			<td><input type="text" name="userName"></td>
    		</tr>
    		<tr>
    			<td>密码:</td>
    			<td><input type="password" name="password"></td>
    		</tr>
    		<tr>
    			<td colspan="2"><input type="submit" value="登录"></td>
    		</tr>
    	</table>
    </form>

dolgin.jsp

    <%request.setCharacterEncoding("utf-8"); %>
    <jsp:useBean id="myUser" class="com.po.Users" scope="page"></jsp:useBean>
    <!-- 第一种:login.jsp表单中名字自动与JavaBean中的属性名匹配 -->
    <%-- <jsp:setProperty property="*" name="myUser"/> --%><!-- name表示要实例化的javaBean,与id一样 -->
    <!-- 第二种:密码为空 -->
    <%-- <jsp:setProperty property="userName" name="myUser"/> --%>
    <!-- 第三种:与表单无关,手工赋值 -->
    <%-- <jsp:setProperty property="userName" name="myUser" value="张三"/>
    <jsp:setProperty property="password" name="myUser" value="123"/> --%>
    用户名:<%=myUser.getUserName() %><br>
    密码:<%=myUser.getPassword() %>

第四种

login.jsp的form改变,其他不变

<form action="javabean/dologin.jsp?mypass=999" name="loginForm" method="post">

dologin.jsp

    <!-- 第四种:通过URL传参的方式给属性赋值 -->
    <jsp:setProperty property="userName" name="myUser"/><!-- userName通过表单传值 -->
    <jsp:setProperty property="password" name="myUser" param="mypass"/><!-- password通过URL传值 -->
    用户名:<%=myUser.getUserName() %><br>
    密码:<%=myUser.getPassword() %>

 

4、<jsp:getProperty>

把上述

    用户名:<%=myUser.getUserName() %><br>
    密码:<%=myUser.getPassword() %>

改为

     <jsp:getProperty property="userName" name="myUser"/>
     <jsp:getProperty property="password" name="myUser"/>

 

5、JavaBean的作用域范围

 

6、jsp+JavaBean实现用户登录(没有连接数据库,密码写死)

com.po下的Users.class见上

com.dap下的UsersDAO.class

package com.dao;
import com.po.Users;

public class UsersDAO {
	public boolean usersLogin(Users u){
		if("admin".equals(u.getUserName()) && "admin".equals(u.getPassword())){
			return true;
		}
		else{
			return false;
		}
	}
}

WebRoot下的login.jsp见上

dologin.jsp

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>

<jsp:useBean id="loginUser" class="com.po.Users" scope="page"></jsp:useBean>
<jsp:useBean id="userDao" class="com.dao.UsersDAO" scope="page"></jsp:useBean>
<jsp:setProperty name="loginUser" property="*" />

<%
	request.setCharacterEncoding("utf-8");
	if (userDao.usersLogin(loginUser)) {
		session.setAttribute("userName", loginUser.getUserName());
		request.getRequestDispatcher("loginSuccess.jsp").forward(
				request, response);
	}
	else{
		response.sendRedirect("loginFail.jsp");
	}
%>

loginSuccess.jsp

<h1><%=session.getAttribute("userName") %>登录成功</h1>

loginFail.jsp

    <h1>登录失败,请重新登录</h1>
    <a href="javabean/login.jsp">返回</a>

 

 

 

五、JSP状态管理

1、http协议的无状态性

当浏览器发送请求给服务器的时候,服务器响应客户端的请求

但是当同一个浏览器再次发送请求给服务器的时候,服务器不知道它就是刚才的浏览器

 

2、cookie

保存用户状态的两大机制

1)session

2)cookie

cookie是Web服务器保存在客户端的一系列文本信息

创建Cookie实现记忆用户名和密码:

login.jsp

<%@ page language="java" import="java.util.*,java.net.*" pageEncoding="utf-8"%>

<html>
  <head>
  </head>
  
  <body>
    <h1>用户登录</h1>
  	<hr>
  	<%
  	    request.setCharacterEncoding("utf-8");
            String username="";
    	    String password="";
    	    Cookie[] cookies=request.getCookies();
		    if(cookies!=null && cookies.length>0){
			for(Cookie c:cookies){
				if(c.getName().equals("username")){
					username=URLDecoder.decode(c.getValue(),"utf-8");
				}
				if(c.getName().equals("password")){
					password=URLDecoder.decode(c.getValue(),"utf-8");
				}
			}
		}
    %>
    <form action="dologin.jsp" name="loginForm" method="post">
    	<table>
    		<tr>
    			<td>用户名:</td>
    			<td><input type="text" name="username" value="<%=username %>"></td>
    		</tr>
    		<tr>
    			<td>密码:</td>
    			<td><input type="password" name="password" value="<%=password %>"></td>
    		</tr>
    		<tr>
    			<td colspan="2"><input type="checkbox" name="isUseCookie" checked="checked">是否记住用户名和密码</td>
    		</tr>
    		<tr>
    			<td colspan="2"><input type="submit" value="登录"></td>
    		</tr>
    	</table>
    </form>
  </body>
</html>

dologin.jsp

<%@ page language="java" import="java.util.*,java.net.*" pageEncoding="utf-8"%>
<html>
  <head>
  </head>

  <body>
	<h1>登录成功</h1>
	<hr>
  	<%
  		request.setCharacterEncoding("utf-8");
  		String[] isUseCookies=request.getParameterValues("isUseCookie");
		if(isUseCookies!=null && isUseCookies.length>0){
			//使用URLEncoder解决无法在Cookie中保存中文字符串问题
			String username=URLEncoder.encode(request.getParameter("username"), "utf-8");
			String password=URLEncoder.encode(request.getParameter("password"), "utf-8");
			Cookie usernameCookie=new Cookie("username",username);
			Cookie passwordCookie=new Cookie("password",password);
			usernameCookie.setMaxAge(864000);
			passwordCookie.setMaxAge(864000);
			response.addCookie(usernameCookie);
			response.addCookie(passwordCookie);
		}else{
			Cookie[] cookies=request.getCookies();
			if(cookies!=null && cookies.length>0){
				for(Cookie c:cookies){
					if(c.getName().equals("username") || c.getName().equals("password")){
						c.setMaxAge(0);//设置cookie失效
						response.addCookie(c);//重新保存
					}
				}
			}
		}
  	%>
  	<a href="users.jsp" target="_black">查看用户信息</a>
  </body>
</html>

users.jsp

<%@ page language="java" import="java.util.*,java.net.*" pageEncoding="utf-8"%>
<html>
  <head>
  </head>
  
  <body>
    <h1>用户信息</h1>
    <br>
    <%
    	request.setCharacterEncoding("utf-8");
    	String username="";
    	String password="";
    	Cookie[] cookies=request.getCookies();
		if(cookies!=null && cookies.length>0){
			for(Cookie c:cookies){
				if(c.getName().equals("username")){
					username=URLDecoder.decode(c.getValue(),"utf-8");
				}
				if(c.getName().equals("password")){
					password=URLDecoder.decode(c.getValue(),"utf-8");
				}
			}
		}
    %>
    <br>
    <br>
    用户名:<%=username %>
    密码:<%=password %>
  </body>
</html>

 

3、session和cookie的对比

 

 

 

六、JSP指令与动作

1、include指令和include动作的例子:

date.jsp

<%@ page language="java" import="java.util.*,java.text.*" pageEncoding="utf-8"%>
<%
	Date d=new Date();
	SimpleDateFormat sdf=new SimpleDateFormat("yyyy年MM日dd月");
	String s=sdf.format(d);
	out.print(s+"<br>");
%>

includeCommand.jsp

    <h1>Include指令</h1>
    <%@ include file="date.jsp" %>

或includeAction.jsp

    <h1>Include动作</h1>
    <jsp:include page="date.jsp" flush="false"></jsp:include><!-- flush:被包含的页面是否从缓冲区读取-->

include指令与include动作区别:

 

2、forward动作

<jsp:forward page="URL"/>

等同于

request.getrequestDispatcher("/url").forward(request,response);

例如:

login.jsp

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<html>
  <head>
  </head>
  
  <body>
    <h1>用户登录</h1>
  	<hr>
    <form action="chap7/forwardAction.jsp" name="loginForm" method="post">
    	<table>
    		<tr>
    			<td>用户名:</td>
    			<td><input type="text" name="username"></td>
    		</tr>
    		<tr>
    			<td>密码:</td>
    			<td><input type="password" name="password"></td>
    		</tr>
    		<tr>
    			<td colspan="2"><input type="submit" value="登录"></td>
    		</tr>
    	</table>
    </form>
  </body>
</html>

forward.jsp

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<html>
  <head>
  </head>
  
  <body>
    <h1>forward动作</h1>
    <jsp:forward page="users.jsp"></jsp:forward>

  </body>
</html>

users.jsp

<%@ page language="java" import="java.util.*,java.net.*" pageEncoding="utf-8"%>
<html>
  <head>
  </head>
  
  <body>
    <h1>用户信息</h1>
    <br>
    <%
    	request.setCharacterEncoding("utf-8");
    	String username="";
    	String password="";
    	if(request.getParameter("username")!=null)
    		username=request.getParameter("username");
    	if(request.getParameter("password")!=null)
    		password=request.getParameter("password");
    %>
    <br>
    用户名:<%=username %>
    密码:<%=password %>
  </body>
</html>

 

3、param动作

login.jsp的from表单的action改为doLogin.jsp,其余同上

dologin.jsp

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>

<html>
  <head>
  </head>
  
  <body>
    <!-- 可以添加新的参数,也可以修改已有的参数 -->
    <jsp:forward page="users.jsp">
    	<jsp:param value="123@qq.com" name="email"/>
    	<jsp:param value="111" name="password"/>
    </jsp:forward>
  </body>
</html>

users.jsp

<%@ page language="java" import="java.util.*,java.net.*" pageEncoding="utf-8"%>
<html>
  <head>
  </head>
  
  <body>
    <h1>用户信息</h1>
    <br>
    <%
    	request.setCharacterEncoding("utf-8");
    	String username="";
    	String password="";
    	String email="";
    	if(request.getParameter("username")!=null)
    		username=request.getParameter("username");
    	if(request.getParameter("password")!=null)
    		password=request.getParameter("password");
    	if(request.getParameter("email")!=null)
    		email=request.getParameter("email");
    %>
    <br>
    用户名:<%=username %>
    密码:<%=password %>
    邮箱:<%=email %>
  </body>
</html>

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值