(个人复习用)jsp web开发重点(待补充)

目录

一、JSP简介(Sun公司开发)

JSP特点

与平台的无关性。
动态页面与静态页面分离。

Tomcat 相关

Tomcat是一个JSP引擎(统一管理并运行jsp的web应用程序)。
安装了JSP引擎的计算机被称为JSP服务器
测试Tomcat是否能启动成功:打开bin/startup.bat后,输入localhost:8080(或者127.0.0.1)
修改Tomcat端口:打开conf/server.xml,修改Connector标签下的port
当修改为80时,网址可以不输入“:80”(80是http默认端口)
部署jsp项目:将整个工程文件放入webapps下
访问jsp项目:localhost:8080/工程名/jsp名
当单个的jsp放在Root目录下时,可以不用输入包名直接访问,即localhost:8080/jsp名
可以在conf/server.xml下修改jsp目录而不用放在webapps下

<Context path="路径名" docBase="项目的绝对路径" debug="0" reloadable="true"/>

JSP原理

jsp引擎把jsp页面转译为java文件,java文件通过编译后生成字节码文件(.class),用字节码文件响应用户需求
当多用户访问同一jsp时,Tomcat服务器会为每一个用户开一个线程。
1.处理html标记符号并显示
2.处理jsp标记
3.处理“<%”、“%>”之间的java程序片并显示

二、JSP语法

JSP页面组成

1.普通的HTML标记符
2.JSP标记
3.变量、方法<%! %>(定义的变量与方法在整个jsp内都有效(全局变量、全局方法))
4.java程序片<% %>(定义的变量为jsp页面的局部变量)
5.java表达式<%= %>("<%="是一个完整的符号,以字符串形式返回)

JSP注释

HTML注释:<!-- 注释内容 -->
JSP注释:<%-- --%>

JSP指令标记

page(可以不放在开头!只是出于可读性)

多种属性:<%@ page 属性1="XXX" 属性2="XX" ...%>
单条属性:<%@ page 属性="xxx" %>
contentType(响应类型、字符编码)
HTML解析器执行:<%@ page contentType="text/html;charset=UTF-8"%>
用本地MS-word执行:<%@ page contentType="application/msword" %>
默认值:"text/html ; charset=ISO-8859-1",不允许多次给contentType指定不同的值!
language(JSP使用的脚本语言)
<%@ page language="java" %>
import(声明包、类)
多个import<%@ page  import="XXX", "XXX" %>
单个import<%@ page  import="XXX" %>
JSP页面默认import属性:"java.lang.*""javax.servlet.*""javax.servlet.jsp.*""javax.servlet.http.*"
session(是否需要session,默认是true)
<%@ page session="true/false" %>(true时可以使用session)
buffer(out的缓冲区大小,默认8kb,也可以设置为none,即不使用)
eg:<%@ page buffer= "24kb" %>
autoflush(out缓冲区被填满时是否自动刷新,默认为true)

当该值为false时,如果out缓存区填满,就会出现缓存溢出异常。
当buffer的值为none时,autoflush只能是true。

isThreadSafe(是否可多线程访问,默认为true)

若isThreadSafe为false时,其他用户只能排队等待。

info(为jsp准备一个常用且经常修改的字符串)
<%@ page info= "we are students" %>
调用getServletInfo()

errorPage(若该页面有exception则显示,默认是false)

<%@ page ErrorPage="true"%>
isErrorPage(其他 JSP 页面的错误页面,默认是false)
<%@ page isErrorPage="true"%>

include(静态插入文件,不会被编译器执行)

<%@ include file= "文件的URL " %>

JSP动作标记

include动作标记(动态插入文件,运行时才将文件加入,会被编译器执行)

<jsp:include page= "文件的URL"/>
或者 <jsp:include page= "文件的URL">
         param子标记
</jsp:include>(将param的值传给文件里)

param 动作标记(name-value,类似map)

<jsp:param name= "名字"  value= "指定给param的值"/>

forward 动作标记(跳转页面)

<jsp:forward page="要转向的页面" /><jsp:forward page="要转向的页面" >
      param子标记
</jsp:forward> (将param的值传到页面)

useBean动作标记(创建并使用JavaBean)

JSP脚本元素

变量、方法<%! %>(定义的变量与方法在整个jsp内都有效(全局变量、全局方法))

java程序片<% %>(定义的变量为jsp页面的局部变量)

java表达式<%= %>("<%="是一个完整的符号,以字符串形式返回)

三、JSP内置对象(不需要声明就可以使用)

request对象(用户->服务器,封装用户提交信息)

信息编码:request.setCharacterEncoding("UTF-8");
getProtocol():获取用户向服务器提交信息所使用的通信协议
getServletPath():获取用户请求的JSP页面文件的目录。
getContextPath():获取用户请求的当前Web服务目录
getRemoteAddr():获取用户的IP地址。
getRemoteHost():获取用户机的名称(如果获取不到,就获取IP地址)
getServerName():获取服务器的名称
getServerPort():获取服务器的端口号

HTML标记

< form >
<form  action= “JSP页面”  method="get/post">
    提交手段
</form>(用request.getParameter()获取)
使用get方法提交的信息会在提交的过程中显示在浏览器的地址栏中
post方法提交的信息不会显示在地址栏中
提交的内容可以是文本框、列表、文本区。
< input >
<input  type="输入对象的GUI类型"  name= "名字"/>
文本框text:<input type="text" name="me"  value="hi"/>
单选框radio:<input type="radio"  name="rad"  value="red"  checked="java" />
复选框checkbox:<Input type="checkbox"  name= "ch"  value="pink"     checked="java" />
(多个选项可以采用相同name和type但value不同的方式)
口令框password:<input type= "password"  name= "me" size= "12"  maxlength="30"/>
隐藏hidden:<input type= "hidden"  name="h"  value= "123"/>
提交submit:<input type= "hidden"  value= "123"/>
重置reset:<input type="reset"/>
< select > < option > 下拉列表
<select  name="myName" size=""/>
  <option  value="item1"/>
  <option  value="item2"/></select>
<option>是子标记,size是同时可见的数目
< textArea >
<textArea  name="名字"  rows= "文本可见行数"  cols= "文本可见列数">
</textArea>
< table >
<table>
    <tr  width="该行的宽度">
     <th  width= "单元格的宽度" >单元格中的数据</th>
        <td  width= "单元格的宽度" >单元格中的数据</td>
    </tr>
</table>
<tr> </tr>定义表格的一个行。
<th><td>标记定义这一行中的表格单元。
<th>定义的单元着重显示,<td>称为普通单元,不着重显示。
< image >
<image  src="图像文件的URL" >描述文字</image>

可以用width和 height属性调整宽高

< embed >(播放音频)
<embed  src="音乐或视频文件的URL" >描述文字</embed>

autostart:音乐或视频文件传送完毕后是否立刻播放(默认为false)
loop:循环次数(-1则无限循环)
width、height:播放器宽和高

超链接
<a href=链接的页面地址?参数1=串值1&参数2=串值2&...&参数n=串值n >文字说明</a>
(串值中不能有汉字!)

response对象(服务器->用户,封装了对用户请求的动态响应)

动态响应contentType

利用setContentType(String s)来改变。

取值:text/html、text/plain、image/gif等。

当contentType改变时,JSP会根据新的类型将jsp页面输出结果返回

HTTP文件头(动态)

HTTP文件头可以用来禁用缓存、设置页面自动刷新和定时跳转网页等。

addHeader(String head,String value)
setHeader(String head,String value)

如果已有相关文件头则会覆盖。

response重定向(无参数跳转页面)

response.sendRedirect(URL url)

response状态行

1yy(1开头3位数):实验性质。

2yy:请求成功。

3yy:请求满足之前应采取进一步行动。

4yy:无法满足请求(404表示请求页面不存在)

5yy:服务器出现问题(500表示服务器内部发生错误)

一般不需要修改状态行,服务器会自动响应发送对应状态码。

可以用response.setStatus(int n)改变状态行。

session对象(可以再多个jsp页面反复使用)

对象id

每个session都被分配了一个String类型的id号,id会放在用户Cookie和服务器中,形成一一对应

用户在访问web服务目录期间,服务器会给该用户分配一个session(用户会话),可以在各个页面使用它,且不同用户session不同。

URL重写(用户不支持Cookie时可以使用,保证session唯一性)

当用户从一个页面重新连接到一个页面时,通过向这个新的URL添加参数,把session对象的id传带过去

可以使用encodeURL()或者encodeRedirectURL()

String str=response.encodeRedirectURL(“second.jsp”);

存储/读取数据

存取:public void setAttribute (String key,Object obj)
(value可以是任意object)
读取:public Object getAttribute(String key)

生存期限

使用session.invalidate()使session无效

关闭服务器时session也会消失

如果用户一段时间未发送请求也会session失效

(默认30分钟,可以通过setMaxInactiveInterval(int interval)来修改)

application对象(所有用户共享,ServletContext实例)

服务器的启动与关闭决定其生命周期

常用方法

存储:public void setAttribute(String  key ,Object  obj)
读取:public Object Attribute(String key)

out对象(输入流,javax.servlet.jsp.JspWriter)

out.print();
out.println();
out.newLine();
out.flush();//清空缓冲区

pagecontent(获取页面out、request、reponse、session、application 等对象)

pageContext对象的创建和初始化都是由容器(Tomcat)来完成的

config(取得服务器的配置信息)

pageConext的getServletConfig() 方法可以获取一个config对象。
Servlet 初始化时,容器把某些信息通过config传递给这个 Servlet。

page(类似于this指针)

page 对象代表JSP本身,只有在JSP页面内才是合法的。

exception(显示异常信息)

只有在包含 isErrorPage=“true” 的页面中才可以被使用,

四、JavaBean

编写、使用Javabean

特点

1.可以实现代码的重复利用。
2.易编写、易维护、易使用。
3.可以在任何安装了Java运行环境的平台上的使用,而不需要重新编译。

命令规则

1.有getter和setter方法

2.boolean类型的成员变量可以用"isXXX"

3.构造方法要有public、无参数

保存javabean的字节码(.class文件)

在\WEB-INF\classes\包名\类名中(可能需要自己手动创建classes文件夹)

创建bean(JSP动作标记:useBean)

<jsp:useBean id="bean的名字" class="创建beans的字节码" scope="application/session/page/request"/>
//scope是生命周期。
//page:当前页面
//request:request期间
//session:session期间
//application:application期间

bean加载原理

JSP引擎根据JSP动作标记给出的bean的id,以及scope,查找JSP引擎内置pageContent对象中是否含有这样的bean。

如果bean存在,就分配给用户;如果不存在,就在字节码中创建。

获取、修改beans的属性

使用getPropertysetProperty方法(前提是必须要有对应的getter和setter方法

<jsp:getProperty  name="id" property="bean属性" />
等价于对应id的javabean.getXXX().
<jsp:setProperty name=“id" property="bean的属性" value= "表达式或者字符串"/>
//property="*"时表示所有属性
//可以不写value,写param="XXX" 表示 value=<%=request.getParameter("XXX")%>

beans的辅助类(用import引入JDK提供的类或自己写的类)

五、Java Servlet(在服务器创建能响应用户请求的对象)

部署、创建与运行

javax.servlet.http包在tomcat的lib/servlet-api.jar中,使用时请导入或者放到jdkXXX/jre/lib/ext下。

servlet的类就是javax.servlet.http包中的HttpServlet类。

编写web.xml

    <servlet>
        <servlet-name>hello</servlet-name>
        <servlet-class>myservlet.control.Example5_1_Servlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>hello</servlet-name>
        <url-pattern>/lookHello</url-pattern>
    </servlet-mapping>

1.两个servlet-name要一样

2.servlet-class就是“包名.servlet名”

3.url-pattern就是链接,访问时的网址就是http://localhost:8080/url-pattern

运行时,servlet会被编译为字节码文件,利用web.xml,用户就可以使用servlet

传递参数

servlet名?参数1=1&参数2=值…参数n=

servlet内就可以利用request.getParameter(参数名)来获取这些对应的值

eg:http://127.0.0.1:8080/ch5/lookHello?moon=loveliness

工作原理

servlet数HttpServlet类的子类的一个实例,由服务器创建并初始化。

当多个用户请求同一个servlet时服务器会为每个用户启动线程而不是进程(互不干扰,且效率更高)

生命周期

1.初始化servlet。第一次被加载时会调用init()方法,只会调用一次

public void init(ServletConfig  config) throws ServletException

2.响应请求时,调用service方法。

public void service(HttpServletRequest request  HttpServletResponse  response) throw ServletException,IOException

3.服务器关闭时,调用destroy()方法,关闭servlet。

public destroy()

通过JSP页面访问servlet

通过表单传递数据

1.利用<form>提交表单
2.用“computeBill?sideA=10.66&sideB=23.9&sideC=897”的多参数方法传值

通过超链接访问

<a href="servlet连接"></a>

需要注意的是href里面的不能带"/"。eg:url-pattern 是/tri 那herf=“tri”

共享变量(用户共享servlet的成员变量)

不写在doGet和doPost里的变量可以被别的servlet调用(尽量避免!)

doGet和doPost

与method的post/get对应。

如果与请求的method类型无关,那doGet的方法可以被doPost调用,反之亦然。

重定向与转发

重定向:当前页面跳转到另一个页面(无参数)

response.sendRedirect

转发:把请求转发给另一个页面(有参数)

request.getRequestDispatcher("XXX").forward(request,response)
//forward作用:使被转发的界面可以继续用request获取数据(传递参数)。

使用session

servlet不能直接用session,需要定义。

HttpSession session = request.getSession(true);

六、MVC模式

MVC模式介绍

M:模型(Model),用于存储数据的对象。
V:视图(View) ,向控制器提交所须数据、显示模型中的数据。
C:控制器(Controller),负责具体的业务逻辑操作。

在JSP中表现为:

M:javabean对象

V:JSP界面

C:servlet

模型的生命周期与视图更新

request、session、application周期的javabean

1.新建javabean对象,并放入request/session/application中。

eg: Music music=new Music();
request/session/application.setAttribute("XXX",music);

2.视图更新。让jsp页面显示javabean的数据

3.jsp页面可以通过

<jsp:useBean id="XXX" type="包名.javabean名" scope="request/session/application"/>

的方法调用。

七、JSP中使用数据库

MySQL数据库管理系统

启动mysql:打开bin/mysqld.exe

mysql有命令行模式或者图形模式。

在安装MySQL时root用户是默认的一个用户,没有密码。

JDBC(提供访问数据库的API)

连接MySQL数据库

1.加载JDBC-数据库驱动程序

需要先导入mysql-connector-java-XXX.jar到jdkxxx\jre\lib\ext下

try
{                   
    Class.forName("com.mysql.jdbc.Driver");//8.0版本mysql为com.mysql.cj.jdbc.Driver
}
catch(Exception e)
{
   System.out.println(e);
}

2.和指定的数据库建立连接

try{  
	String uri = "jdbc:mysql://IP地址或者localhost:端口名/数据库名";
    String user ="root";
    String password ="99";
    Connection conn = DriverManager.getConnection(uri,user,password);
   //或者直接让uri变为"jdbc:mysql://IP地址或者localhost:端口名/数据库名?user=root&password=99"
   //如果端口是3306可以忽略不写
   //为了防止中文乱码,有时可以再uri后添加“&characterEncoding=gb2312”
   ...
   conn.close();
   }
catch(SQLException e){
      System.out.println(e);
}

mysql语句相关

建立数据库

create  database  库名;

删除数据库

drop database 库名;

建表:

在命令行模式建立表时要先use 库名
CREATE TABLE bookList SET gb2312
(
  ISBN varchar(100) not null ,
 name varchar(100) CHARACTER SET gb2312,
 price float ,
 PRIMARY KEY (ISBN)
);   

插入数据:

insert into bookList values('7-302-01465-5','高等数学',28.67);

查询数据

select XXX from XXX WHERE ......

删除表:

drop table 表名;

用结果集、非结果集操作数据库中的表(ResultSet)

查询数据:

try
{
	Statement stmt=con.createStatement();
	String sql="SELECT * FROM product"
	ResultSet rs=stmt.executeQuery(sql);
	While(rs.next())
	{
		rs.getInt("XXX");
		rs.getString("XXX");
	}
	rs.close();
	stmt.close();
	//conn.close();
}
catch(SQLException e )
{
    System.out.println(e); 
}

数据集的字段数:

int Count_Column = rs.getMetaData().getColumnCount();

数据集第i个字段名:

String name=rs.getMetaData().getColumnName(i);

更新、删除、添加记录(无结果集)

String sql="UPDATE product SET price = 6866 WHERE name='海尔电视机'";
stmt.executeUpdate(sql);

利用结果集来更新数据库数据(改变的是数据库的数据)

rs.absolute(n);//结果集rs的游标移动到第n行
rs.update+对应类型(String columnName, 对应类型 x); //第n行的列名是columnName的值变为x
rs.updateRow();//更新结果集数据

利用结果集来插入数据库数据

rs.moveToInsertRow();//无参数,并不是最后一行而是在一个独立于之的缓冲区
rs.updateString("姓名", "赵刚");
rs.updateString("学号", "8888");
rs.updateInt(3, 66);
rs.updateInt(4, 77);
rs.updateInt(5, 88);
rs.insertRow();//更新结果集数据

预处理语句(PreparedStatement)

优点

提高了访问数据库的速度
防止sql注入

PreparedStatement pre=conn.prepareStatement(String sql);

ResultSet rs=pre.executeQuery()

pre.executeUpdate()

使用通配符(用?代替字段值)

prepareStatement pre=
con.prepareStatement("SELECT * FROM product WHERE price < ? ");
pre.setDouble(1,6565);//set+类型(索引,即第几个?,对应值);

事务(commit,一次性处理多个sql)

事务四大特性(ACID)

1、原子性(Atomicity)

事务是一个不可分割的单位,事务中的所有SQL等操作要么都发生,要么都不发生。
2、一致性(Consistency)

事务发生前和发生后,数据的完整性必须保持一致。

3、隔离性(Isolation)

当并发访问数据库时,一个正在执行的事务在执行完毕前,对应其他的会话是不可见的,多个并发事务之间的数据是相互隔离的。备份的参数 --single-transaction

4、持久性(Durability)

一个事务一旦被提交,它对数据库中的数据改变就是永久性的。如果出了错误,事务也不允许撤销,只能通过“补偿性事务”

conn.setAutoCommit(false);//关闭自动提交
......
conn.commit();//提交事务
在出现SQLexcption时要执行conn.rollback();进行回滚

常见数据库连接

try
{                   
    Class.forName("com.mysql.jdbc.Driver");
    String uri = "jdbc:mysql://IP地址或者localhost:端口名/数据库名";
    String user ="root";
    String password ="99";
    Connection conn = DriverManager.getConnection(uri,user,password);
   	String sql="SELECT * FROM product WHERE NAME=?"
   	PreparedStatement pre=conn.prepareStatement(String sql);
   	pre.setString(1,“NO1”);
	ResultSet rs=pre.executeQuery(sql);
	//pre.executeUpdate();
	While(rs.next())
	{
		rs.getInt("XXX");
		rs.getString("XXX");
	}

}
catch(SQLException e )
{
    System.out.println(e); 
    conn.rollback();
}
catch(Exception e)
{
   System.out.println(e);
}
finally
{
	try 
	{
    	if (pre != null)
    	{
        	pre.close();
        }
        if (conn !=null)
        {
        	conn.close();
        }
    }
    catch (Exception e)
    {
    	e.printStackTrace();
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值