JSP标签自身的基础就是servlet(即java语言),因为servlet代码写起来不是很方便,所以jsp相当于是把servlet打了一个包,
在服务器端运行.jsp文件的时候,实际上会自动把jsp文件编译成servlet相关文件来执行,
因此JSP本身就是一款封装了servlet的标签语言,只不过它是靠GlassFish、Tomcat等相关程序来编译的。
一、基本格式
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>//告诉编译器用的是java语言,引入java的util包,utf-8编码
<html>
<head>
<head/>
<body>
<%
out.println("当前时间:"+new java.util.Date());//在<% %>之间可以写java代码片段
%>
<%
out.println("当前时间:"+new java.util.Date());//可以有多个java代码片段
%>
<body/>
<html/>
二、jsp标签元素
1.指令元素
例:<%@ pageEncoding="utf-8" %>//告知编译器用utf-8编码
<%@ errorPage="my.jsp" %>//告知编译器如果程序出错,将会自动跳转到指定my.jsp页面
<%@ include file="my.jsp" %>//静态引入另外的页面内容,但该页面只能有内容(如文字、图片),不能有其它HTML标签元素
2.脚本元素
例:<% java代码 %>//编写java代码
<%! int i = 5 %>//定义一个变量
<%! public void set()
{
System.out.println(123);//定义一个方法,注:<% 这里面不能直接定义方法 %>
}
%>
<%= i+1 %>//表达式,获取i变量并且运算
3.动作元素
例:<jsp:forward file="my.jsp"></jsp:forward>//跳转到指定页面
<jsp:incluce file="my.jsp"></jsp:incule>//动态引入另外的页面内容,但该页面可以包含其它HTML标签元素
三、jsp内置对象
1.out:输出打印对象
2.request:接受客户端的http请求
3.response:封装jsp的产生的回应
4.session:用于保存用户的信息,跟踪用户的行为
5.application:多个用户共享该对象,可以做计算器
6.pageContext:jsp页面的上下文,作用范围只是本页面
7.exception:运行时的一个异常
8.page:jsp这个实例本身
9.config:jsp对应的servlet的配置,可以得到web.xml中的参数
所有内置对象,只能在<% %>里面使用
四、mvc开发模式(m模型、v视图、c控制器)
它是分离了:数据输入(视图界面),数据处理(控制器+模型),数据显示(视图界面)
案列详解-用户登录系统
①主页跳转页面:index.jsp//它是放在web目录下
<%@ page contentType="text/html" import="java.util.*" pageEncoding="UTF-8"%>
<html>
<head>
<title>主页跳转</title>
<head/>
<body>
<jsp:forward page="/WEB-INF/login.jsp"></jsp:forward>//跳转到登录页面(出于安全考虑,需把登录页面放在WEB-INF目录下,此目录下的页面不能直接访问)
<body/>
<html/>
②登录页面(视图):login.jsp//它是放在WEB-INF目录里
<%@ page contentType="text/html" import="java.util.*" pageEncoding="UTF-8"%>
<html>
<head>
<title>登录界面</title>
<head/>
<body>
<form action="/MyWeb/loginyz" method="post">//这里的MyWeb只的是项目名称
用户名:<input type="text" value="<%=user %>" name="sr1"/><br/>//这里可以利用表达式来保存输入的用户名
密 码:<input type="text" value="<%=password %>" name="sr2"/><br/>
<input type="submit" value="登录"/>
<form/>
<body/>
<html/>
③登录验证页面(控制器+模型):loginyz.java//它是放在src目录里,它是一个Servlet文件,Servlet文件实际就是java文件
@WebServlet(urlPatterns = {"/loginyz"})
public class loginyz extends HttpServlet {
protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
String user= request.getParameter("sr1");
String pass = request.getParameter("sr2");
try
{
//1.连接SQLServer数据库,连接数据库的驱动包可以在oracle官网下载
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
Connection conn= DriverManager.getConnection("jdbc:sqlserver://192.168.0.100:1433;databaseName=sjkname","sa","123456");
//2.查询数据
PreparedStatement ps = conn.prepareStatement("select Name,sex from users where Code=? and Password=? ");
ps.setString(1,user);
ps.setString(2,pass);
ResultSet rs = ps.executeQuery();
//3.判断是否有数据
if(rs.next())
{
ArrayList<String> arr = new ArrayList<String>();//将数据添加到ArrayList集合中
arr.add(rs.getString(1));
arr.add(rs.getString(2));
request.setAttribute("lie",arr);//传入数据
request.getRequestDispatcher("/WEB-INF/logincg.jsp").forward(request,response); //跳转到登录成功页面,并传入request
rs.close();
ps.close();
conn.close();
}
else
{
try (PrintWriter out = response.getWriter())
{
out.println("<!DOCTYPE html>");
out.println("<html>");
out.println("<head>");
out.println("<title>错误提示</title>");
out.println("</head>");
out.println("<body>");
out.println("<h1>登录失败,请重新登录<a href=/MyWeb/index.jsp>返回</a></h1>");
out.println("</body>");
out.println("</html>");
}
rs.close();
ps.close();
conn.close();
}
}
catch(Exception ee)
{
ee.printStackTrace();
}
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
processRequest(request, response);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
processRequest(request, response);
}
@Override
public String getServletInfo() {
return "Short description";
}
}
注:这里是把控制器和模型写在一起了,实际开发中,应把部分java代码分离出去单独写个类,如:把数据库连接分离出去,这样就相当于创建了一个数据库连接模型
④登录成功页面(视图):logincg.jsp//它是放在WEB-INF目录里
<%@ page contentType="text/html" import="java.util.*" pageEncoding="UTF-8"%>
<html>
<head>
<title>登录成功</title>
<head/>
<body>
<h1>登录成功,欢迎光临!</h1>
<table border="1">
<tr><td>你的信息是</td></tr>
<%
ArrayList a = (ArrayList)request.getAttribute("lie");//获取request里的数据
for(int i=0;i<a.size();i++){
%>
<tr><td><%= a.get(i) %></td></tr>//利用for循环动态添加表格的行数,并使用表达式显示数据
<%
}
%>
</table>
<body/>
<html/>
五、Cookie、Session、Request、Application、ServletContext的区别
①cookie:是保存在客户端的临时信息文件,供单个创建它的用户访问,作用范围全局,生命周期可设置具体时间
Cookie c =new Cookie("name","xy");//创建cookie
c.setMaxAge(3600);//设置生命周期为一小时,秒为单位
response.addCookie(c);//添加cookie到浏览器
Cookie[] cc =request.getCookies();//读取cookie
for(int i= 0;i<cc.length;i++)
{
System.out.println(cc.getName()+cc.getValue());//键+值(一般值需要使用MD5进行加密)
}
String val = java.net.URLEncoder.encode("张三","utf-8");
Cookie c =new Cookie("name",val);//创建带中文的cookie值
String var = java.net.URLDecoder.decode(c.getValue(),"utf-8");//取出中文的值并解码
②session:是保存在服务器端内存里的临时信息类,供单个创建它的用户访问,作用范围全局,生命周期可设置具体时间,默认30分钟
s.setAttribute("name","张三");//添加值
s.setMaxInactiveInterval(3600);//设置生命周期一小时,秒为单位(默认生命周期是30分钟,也可以在web.xml文件中直接修改这里以分钟为单位)
s.invalidate();//让session马上失效
String u = (String)request.getSession().getAttribute("name");//取出Session中的值
③request:是保存在服务器端内存里的临时信息类,供单个创建它的用户访问,作用范围全局,生命周期是一次性的
request.setAttribute("name","张三");
request.getAttribute("name");
④application:是保存在服务器端内存里的共享信息类,供所有用户访问,作用范围全局,生命周期是应用程序启动到停止,它是jsp文件调用
application.setAttribute("name","张三");
application.getAttribute("name");
⑤servletcontext:是保存在服务器端内存里的共享信息类,供所有用户访问,作用范围全局,生命周期是应用程序启动到停止,它是Servlet文件调用
(1)普通操作
ServletContext sc = this.getServletContext();//获取ServletContext
sc.setAttribute("name","张三");//添加值
String s = (String)sc.getAttribute("name");//取值
sc.removeAttribute("name");//删除值
(2)将用户名在web.xml文件中配置,方便所以文件使用
<context-param>
<param-name>name</param-name>
<param-value>root</param-value>
</context-param>
String ss = this.getServletContext().getInitParameter("name");//获取值
(3)读取配置文件
InputStream is = a.class.getClassLoader().getResourceAsStream("pz.properties");//使用a类的类加载器读取src目录下的配置文件
InputStream is = this.getServletContext().getResourceAsStream("pz.properties");//普通读取配置文件
Properties pp = new Properties();
pp.load(is);//加载配置文件
System.out.pritnln(pp.getProperty("name"));//读取配置文件里的用户名(如:配置文件里有name=xy)
(4)读取文件的路径
String path = this.getServletContext().getRealPath(/tp/1.jpg);
六、jquery与服务器交互数据
<html>
<head>
<meta charset="UTF-8"/>
<script type="text/javascript" src=""></script>
<script type="text/javascript">
$(function(){
$('#a').click(function(){
$.ajax({
url:"http://222.2.2.2/json.html",//链接地址
dateType:"json",//数据类型
type:"post",//传输类型get
beforeSend:function(){//修改参数判断是否已点击
$('#a').attr('dis','1');
}
success:function(result){//加载数据
$('#b').html(result);
}
complete:function(){//删除参数
$('#a').removeAttr('dis');
}
});
});
});
</script>
</head>
<body>
<p><a id=a>查询</a></p>
<div id="b"></div>
</body>
</html>