jsp基础实用教程

jsp教程

  • jsp文件写下后执行变成.java和.class文件,自动把写的java属性以及方法写入一个final类

a.脚本元素

  • 注释方法
1. <!-- html -->
2. <%--jsp --%>
3. <%
   //java
   %>
  • 定义
<%!
//存放属性和方法,不可放赋值以及其他语句
//不能写抽象方法,因为该类生成的未final类不可以被继承
public String name;
public String getname(){
	return name;
}
int a=9;正确
a=0;错误---因为是转换为类的内部属性和内部方法,不可以直接这样
%>
  • 表达式
为print里打印的数据
<%="hello world"%>------------out.print("hello world")(编译后的实际情况),内部不可加;
  • jsp代码片段
<%
放于函数service()方法内部,不可嵌套方法
//数据处理
	name="jike";
	int a=8;//局部变量需初始化
	int b;//虽不报错,但不可调用
	System.out.print(name);//输出在控制台
	Date n=new Date();
//不可定义方法
%>

b.指令元素

  • 指令:下命令、页面配置信息、导包--------语法:<%@ page|include|taglib %>

  • page指令: language(页面上可以使用的脚本语言)、contentType(给浏览器看的)、pageEncoding(文件保存在硬盘上的格式)、import(导包语句)、 errorPage=“”(发生错误时前往的页面,跳转的页面必须声明isErrorPage=“true” )

    1. 一般是第一行

    2. 可以出现多次

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ import='java.lang' %>
  • include指令
  1. 静态包含:没动态包含,没有交互(被包含的文件内容一般不变)
  2. 写在body里
<%@ include file='' %> 
//file后面的文件先导入成为jsp文件,再转换为java,class文件---因此导入时间在转换之前,所以为静态文件
  • taglib指令
<%@ taglib prefix="c" url="core包位置" %>

c.动作元素

  • 动作元素–服务器做的事 语法:jsp:include</jsp:include>

  • jsp:include:动态包含(调用)—两个jsp文件(被包含文件和当前文件)分别编译–即两个.java 和两个.class文件

<jsp:include page="header.jsp" flush='false'>
	<jsp:param value ="zxy" name="name"/>
	<jsp:param value ="sad" name="name"/>  传递参数
</jsp:include>
//flush="true"每次都去判断包含的文件是否更新过,更新过则刷新
String[] values=request.getParameterValues("name|age");获取传递的参数
  • jsp:forword:服务器端跳转(页面不跳转,地址不改变)---->客户端跳转(”responds.sendredict(“forward_sec.jsp”)“)(客户端跳转为外部不断访问)
<jsp:forward page=""></jsp:forward>
  • main.jsp
    <form name="info" action="forward_first.jsp">
    	<input type="text" name="username"/>
    	<input type="password"  name="pwd"/>
    	<input type="submit" />
    </form>
    
  • forward_first.jsp
    <jsp:forward page="forward_sec.jsp"></jsp:forward>
    
    forward_sec.jsp
    <%
    	String username=request.getParameter("username");
    	String pwd=request.getParameter("pwd");
    %>
     username :<%=username %>
     pwd : <%=pwd %>
    
  • 页面上如何用标签的方式去创建对象/值取值/设置值

  • jsp:useBean:创建对象

​ useBean :数据bean,vo/业务bean

​ Java Bean :java类:1.public 2.无参数的构造方法 3.有getter、setter方法

  • jsp:setProperty:设置属性值

  • jsp:getProperty:取值

  • <jsp:useBean id="对象名" class="java bean的全名"></jsp:useBean>
    class----> student stu1=new student();创建对象
    创建并传递值(从usebean中获取内容):<jsp:setProperty property="设置属性名" name="id 对象名" value="值"/>
    <jsp:getProperty property="获取的属性名" name="id 对象名" value="值"/>
    

考点:动态包含 vs 静态包含

  1. <jsp:include page=“header.jsp” flush=“false”></jsp:include>------page:work目录下jsp转换过去的.java文件

​ <%@ include file=‘’ %> --------file:硬盘上的jsp文件

  1. 静态:one file

​ 动态:两个运行文件

  1. 静态:编译一次,第一次访问慢,后面几次快

​ 动态:编译两次,第一次访问也慢

  1. 静态:包含静态文件不变

​ 动态:包含变的东西

  1. 静态:java之前,不可传参

    动态:调用的时候用,可传参

九大JSP内置对象

  • 内置对象—>:容器tomcat内部;:创建;对象 类:每个内置对象都有一个人相应的类--------->我们的工作:用在脚本元素中----------------->用途

  • 内置对象可在脚本元素(<%%>//<%=%>//)里直接使用,无需创建----类似java里的封装好的方法

  • 作用域:4种**,page/request/application(服务器上的网站—在多个用户打开的浏览器页面之间共享)/session(对本机浏览器页面有效–个人使用)**

  1. out:页面输出(每个jsp页面都有一个独立的out对象)
where:<%
		out.print("<h1>error</h1>")
		out.print(<br>)换行
		/out.write()/
		out.println("在浏览器上不换行 在控制台上会换行")
		%><%=%>
what : 往页面输出内容
作用域:page---------> 在.java文件里有效 ----> jspServlet
  1. request:至少两个页面之间,数据的传递(共享)+form
类:javax.servlet.http.HttpServletRequest
***HttpServletRequest getcontextPath//getsession
作用:封装数据,传递数据
form : 包裹,数据提交的单位
<form action="" method="get/post" name="">
	name : <input type="text" name="name"/><br/>
	pwd : <input type="password" name="pwd"/><br/>
	sex : 男<input type="radio" name="sex"/><br/>
		女<input type="radio" name="sex"/><br/>
	habit: 吃饭<input type="checkbox" name=habit><br/>
			喝水<input type="checkbox" name=habit><br/>
			<label>跳舞<input type="checkbox" name=habit><br/></label> --->加了label后在文字处点击也可以选择
</form>
属性属性值作用
typetext文本
password密码
radio单选框
checkbox复选框
submit提交 按钮 只传递有name的
range --grade属性显示分数进度条
color调色器
date日历
hidden隐藏域
方法作用
request.setCharacterEncoding(“encoding”)处理乱码
request.getParameter(“name”)获得数据
request.getParameterValues(“name”)获得数组内容–常为checkbox内容接收器
request.getRequestDispatcher(“跳转的页面.jsp”).forward(request,response);服务器端跳转,可以把页面数据传送给另一个页面,类似jsp:forward
request.setAttribute(name, obj)可以随着传递到别的网页MAP,传递其他要传的数据
object oo=request.getAttribute(name)只能这样获取----Map
1.接受数据
name=request.getParmeter("name");
2.封装数据
student u=new student(name);---usebean
3.处理数据
u.setname("what");
4.显示数据:存值+跳转+显示
//存值
request.setAttribute("u",u);
//跳转:是否带值
//是:服务器跳转:1.<jsp:forward page=""/> 2.request.getRequestDispatcher("你要跳转的页面").forward(request,response)
//否:客户端跳转/重定向--->request.redict()
						response.sendRedirect("跳转页面")
  1. response:返回值

    作用:传数据+存数据
    
    方法作用
    response.setCharacterEncoding(“utf-8”);处理get方法乱码
    response.setContentType(“text/html; charset=UTF-8”);处理get方法乱码
    response.sendRedirect(“跳转页面”)无参客户端跳转
  2. session:跟踪会话—模拟服务器

会话:客户端+页面+服务器--》客户端-浏览器 访问 服务器 上的 页面
开始:第一次访问
结束:会议时间到,浏览器、服务器关闭
默认周期:30分钟
会话--->开始 到 结束 时间里面打开的页面集合
作用:作用类似秘书,做笔记,记录这段时间session的数据
session:保存多个页面共享的数据(多次) ----request保存为少次2
保存信息如:用户信息+权限信息+购物车
方法作用
session.getAttribute(“name”)可以存储共享数据
session.setAttribute(key,value)类似sql的作用
session.getId()
session.isNew()一个浏览器是一个整体,第一次用这个浏览器为true
session.invalidate()退出登录
session.setMaxInactiveInterval(arg0)
session.removeAttribute(“name”)
  1. application—应用程序—端口号–zjgsu.edu:8080(整个网站)

作用域:服务器上的网站—在多个用户打开的浏览器页面之间共享

作用:大概统计在线人数

方法作用
application.setAttribute(key,value)计数器
application.getAttribute(key)
  1. pageContext:路径–页面上下文—java->class xxx{里的内容}

  2. page:this

  3. config

  4. exception:页面上的异常—出错的页面errorpage=“error.jsp”—错误处理页面iserrorpage=true

HTTP Status

  1. 500 服务器内部错误-------网页语法错误—错的都是翻译后的class里的内容–代码写错
  2. 503 过载
  3. 404 网址错误–地址写错

目录描写规则

  • 相对–当前目录下的文件 ---- ./error.jsp ------- error.jsp
  • 相对–不在同一目录下----父级: …/ …/…/
  • 相对–不在同一目录下----子级: ./dir/index.jsp
  • 绝对路径------<%=request.getContextPath()%>/index.jsp

表格

<table border="1">
	<tr> 行
	<td>make</td> 列
	<td>44</td>
	</tr>
一行多个之间无明显分界线,但同一列字段长度相同
	<tr>
	<td>whast</td>
	<td>444</td>
	</tr>
</table>

乱码处理

出现乱码的本质原因:若三种编码格式(即下列原因中的a,b,c三种)不一致,就会出现乱码

原因一:
  • jsp ------保存在硬盘----------这里有一种编码a

修改方法:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="存储在硬盘上的编码a"%>--修改 pageEncoding为utf-8
原因二:
  • tomcat------这里为iso-8859-1编码b(不支持中文)<--------乱码原因

修改方法:

  1. 针对form表单post方式:

    添加request.setCharacterEncoding("UTF-8");       form表单method为post时
    
  2. 针对form表单get方式:

    a. String name=request.getParameter("name");
       添加name=new String(name.getBytes("iso-8859-1"),"utf-8"); 
    
    b. 修改tomcat配置--在tomcat的conf/server.xml文件里65行修改为(不推荐使用)
    	<Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" 			       redirectPort="8443" URIEncoding="utf-8"/>
    
原因三:
  • class-----返回浏览器显示------这里有一种编码c----出错原因可能为浏览器页面编码不同

**修改方式:**在显示页面添加以下语句

response.setCharacterEncoding("utf-8");
response.setContentType("text/html; charset=UTF-8");

传递数据的方法

  1. 表单传递数据

     form:
       action:jsp+servlet--->servlet
       method: get|post
       - get:form中数据拼接到浏览器地址栏的后面去
       - post:包装成一个独立的流的方式传过去
    

    区别:

    • 安全性—get : 安全性更低,post更为安全

    • 传递数据大小—get 4k , post不限定大小

    • 效率----get效率高于post

  2. 通过链接传

    <a herf="www.baidu.com或者ok.jsp?hb=cat&name=pp可传递数据">    为get方式传参数
    
  3. 隐式传参

    <input type="hidden" name="data" value="haha"/>      get方式传时也可被看见,只是在页面上没有
    

记住密码 vs 自动登录

cookie:网站放的,放在我的本机的,用于提高用户体验的,可以有多个cookie文件,可拒绝的,涉及隐私的

  • 大小:4k

  • 多少: 一个网站可以放—firefox:20个,一个浏览器可以保存多少个–firefox可放150个

  • 如何创建: Cookie c=new Cookie(“key”,value)

    ​ key : c.getName() value : c.getvalue()

  • 如何放:response.addCookie© -------------如何获取:request.getCookies()

  • 作用:

    • 广告—cookie共享联盟
    • 浏览记录
    //create cookies
    	Cookie name=new Cookie("us","zhangsan");
    	Cookie pwd=new Cookie("pwd","123");
    //set livetime
    	name.setMaxAge(60*60*24*7);//in seconds
    	pwd.setMaxAge(60*60*24*7);
    //put cookies
    	response.addCookie(name);
    	response.addCookie(pwd);
    //get cookies
    	Cookie[] cks=request.getCookies();
    	for (int i=0;i<cks.length;i++){	
    		out.print(cks[i].getName()+":"+cks[i].getValue());
    	}
    

数据库

java-bean-----vo----entity—Entity-Relationship

流程:

//加载驱动程序
	//创建链接
	//写sql语句
	//创建preparedStatement+一些设置
	//发送语句到mysql
	//得到结果做处理
	//关闭流
	
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

public class db {
	public static boolean checklogin(String name,String pwd) throws Exception{
		// 1.加载驱动程序,驱动程序加载过来
		Class.forName("com.mysql.jdbc.Driver");
		// 2.创建链接
		String url = "jdbc:mysql://localhost:3306/student";
		String user = "root";
		String password = "root";
		Connection conn = DriverManager.getConnection(url, user, password);
		// 3.写sql语句---> ?为占位符
		String sql = "select name,pwd from student where name=?";
		// 4.创建preparedStatement+一些设置
		PreparedStatement ps = conn.prepareStatement(sql);
		ps.setString(1, name);// 1为sql中的第一个问号下标
		// 5.发送语句到mysql
		ResultSet rs = ps.executeQuery();// 查询
		// 6.得到结果做处理
		String pass=null;
		while (rs.next()) {// 游标 select id,name,age from student where id=?
			 pass=rs.getString(2); // 获得查询的数据按顺序来
		}
		// 7.关闭流
		ps.close();
		conn.close();
		if (pass.equals(pwd)){
			return true;			
		}else
			return false;
	}
}
  • 2003–连接不上----service.msc里把MYsql57服务打开

MVC模式

  • model1(二层模式)

    • jsp+javabean

    • jsp-数据获取显示(form)+流程控制(if -else) 混杂—既展示还控制

    • javabean - 数据存储,业务bean

    • 维护:修改、维护较为麻烦

  • model2 (三层模式)------MVC模式

    • jsp+javabean+servlet

    • jsp:数据获取+显示(浏览器)

    • servlet:流程控制+数据封装==》获取数据+封装+调用Dao

    • JavaBean:vo定义+业务bean(数据库交互+增删改查)

    • MVC

      • model:保存数据(类,实体,数据保存)–vo、dao(JavaBean中)
      • viewer:用户交互,页面显示–jsp
      • controller:控制器—》流程(if-else)servlet
    • servlet

      • src:java程序+javax(服务器端)+doGET/doPost,多线程服务

      • 定义在服务器端的java程序,用户处理客户端的get、post请求

      • 特点:与平台无关(跨平台)、与协议(http)无关,在服务器上运行,由服务器调用执行

      • 如何创建

        • 继承servlet–父类—多态

        • 继承httpservlet–子类《==我们采用

          • 继承该类、重写doGet和doPost方法—将之前的数据处理handle里面的代码放进来

          • 配置web.xml文件《==服务器重启时读取的配置文件

          定义为servlet类的类
          	<servlet>
          		<servlet-name>StudentServlet</servlet-name>
          		<servlet-class>com.zxy.servletdemo.StudentServlet</servlet-class>
          	</servlet>
          	指定访问上面servlet的页面
          	<servlet-mapping>
          		<servlet-name>StudentServlet</servlet-name>
          		<url-pattern>/StudentServlet</url-pattern> --/表示为根目录下
          	</servlet-mapping>
          
          • 在jsp页面上进行访问—》要记得地址拼接
          • 重启web服务器
      • servlet的生命周期

        • init–初始化–只调用一次–>创建servlet对象(只在第一次的时候创建)
        • service–处理请求–doGET、doPost
        • destroy–销毁

EL/JSTL

  • EL : 表达式语法(Expression Language),对每个内置对象设置了EL中对应的对象标签

    • request --> requestScope
    • session --> sessionScope
    • get/set --> getter/setter
    • 提供了一种简便的策略 . or []
    • request.getParameter(“name”) --> r e q u e s t S c o p e . n a m e / { requestScope.name }/ requestScope.name/{ requestScope[“name”] }
    • 数组:request.getParameter(“name”) --> ${requestScope.name[0]}
    • 获取路径:pageContext.request.contextPath
    • 运算符: empty not
  • JSTL : ( Java server page(jsp) standard tag library ) 在页面上以标签的形式输入输出

    • 在https://tomcat.apache.org/taglibs/standard/下载包,导入jstl和standard

    • 标签库:

    • 核心标签库(core):输入输出+流程控制

    • 函数、定义变量+赋值

    • 顺序

      • 先引入 <%@ taglib prefix=“c” url=“http://java.sun.com/jstl/core” %>
      • 再定义 <c:set var=“name” value=“zxy”></c:set>
      • 再获取 <c:out value=“${name}”></c:out>
    • 取变量 : jstl(标签)+el(标签属性)—》 <c:out value=“${name}”></c:out>

    • 循环:<c:forEach begin=“1” end=“” items=“list” var=“stu” varStatus=“vs” step=“”>

      s t u . s n o − {stu.sno}- stu.sno{vs.index}- v s . c o u n t − {vs.count}- vs.count{vs.first}

      ​ </c:forEach>

      • items为遍历的数组
      • var为遍历的指标类型
      • step为步数间距
      • varStatus为当前遍历的属性
    • switch case

    <c:choose>
    	<c:when test="${stu.age gt 30 && stu.age le 40}">大海</c:when>
    	<c:otherwise>这相当于defalut</c:otherwise>
    </c:choose>
    
    <c:forTokens items="good good good day study up" var="its">
    ${its}
    </c:forTokens>
    
    • 异常捕获
    <c:catch var="exceptionname">
    ${1/0}
    </c:catch>
    

写jsp的顺序

  • 创建数据库
  • 写一个vo–javabean–与数据库对应
  • 写一个servlet
  • 写一个iuserdao接口记录数据库增删改查的入口
  • 写一个userdaoimpl来实现iuserdao的方法
  • request.getsession().setAuttribute(user);
  • 表单为post类型 不可以通过链接传参 只能隐式传参
  • a标签为get类型可以通过链接传参?method=login

知识点补充

  • 软件开发模式
    • cs --》客户端服务器模式–可看成如电脑上的QQ与服务器交换信息
    • bs–》浏览器服务器、服务库服务器模式–网站开发
    • 两者特点比较
      • cs–开发维护成本高、服务器负载低、协议自己定比较安全、运行环境多
      • bs–https略不安全、服务器负载高、常用
  • 默认端口号80 文件放在tomcat的webapps
  • jsp页面组成:html+jsp指令+《%%》包含的Java片段
  • jsp变换:服务器jsp引擎将jsp页面转换为Java文件,并编译这个Java文件为字节码文件,然后执行字节码文件
  • 当多个客户端请求同一个jsp页面时,tomcat为每个客户端开了一个线程
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值