jsp 使用了impot还是导不出_Jsp文件

1. Jsp文件被处理的过程

浏览器访问jsp文件时,会被jsp引擎翻译成一个java类,再编译成class文件,最终

Servlet引擎执行class文件,将要响应的内容输出给客户端浏览器。所有要响应的内容都是

通过out.write()或out.print()输出给浏览器的,最终响应给浏览器的其实就是html页面。

Out.write():是输出静态的html元素

Out.print():是输出动态的java元素

两种输出合并在一起,组合成一个完整的html文档,并把html页面通过字符流输出到浏览器上(输出又叫响应)

out.write("rn");

out.write("<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">rn");

out.write("<html>rn");

out.write("<head>rn");

out.write("<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">rn");

out.write("<title>Insert title here</title>rn");

out.write("</head>rn");

out.write("<body>rn");

out.write("t<h2>我是index.jsp</h2>rn");

out.write("t");

for (int i = 1; i <= 5; i++) {

out.write("rn");

out.write("ti=");

out.print(i);

out.write("<br>rn");

out.write("t");

}

out.write("rn");

out.write("</body>rn");

out.write("</html>");

同一个Jsp文件在第一次访问时,会比较慢一点,因为该文件要被翻译和编译,后续再请求该jsp文件时,就不需要再次翻译和编译,所以就很快了。在实际的项目中,正式上线前,所有的jsp页面都会被公司内部员工访问一次。

2. jsp页面的构成元素

在jsp页面上可以存在如下几种元素:

  1. 静态html元素 ,如 <h3>我是h3标签</h3>
  2. 动态jsp脚本,语法<% java代码 %>

<%

int a=10,b=2;

out.print("a/b="+a/b);

%><br>

  1. 动态jsp表达式,语法:<%=java表达式 %>

例如:

<%=a/b%>

<%=stu.getName() %>

Jsp脚本和表达式不能相互嵌套

4) 注释:jsp页面上可以写两种注释

第1种:html注释,语法:<!-- 注释内容 -->

第2种:jsp注释:语法: <%-- 注释内容 --%>

两种注释的区别:html注释在源代码中可见(保留了html注释),jsp注释在源代码中是没有的

3.指令

jsp指令的语法:<%@ 指令名 属性名=”值” 属性名2=”值2” %>

常用指令

  1. page指令:设置页面相关的属性,比如使用的脚本语言:language="java",

errorPage属性等

<%@ page language="java" contentType="text/html; charset=UTF-8"

pageEncoding="UTF-8" errorPage="error.jsp"%>

  1. include指令:把其它的文件包含到当前jsp页面中,当前jsp页面叫主文件,使用了include指令包含后,被包含的文件会和主文件一起翻译和编译

使用场合:当一个站点的多个页面的头部或者尾部相同时,就可以用include指令把头部或尾部页面包含到多个页面中。

注意:当要包含一个jsp页面时,要把骨架标签删除,只保留一个page指令和实际的内容就行了

<%@ page language="java" contentType="text/html; charset=UTF-8"

pageEncoding="UTF-8"%>

<div style="background-color: yellow;margin:1px auto;width:90%;height:100px">

我是头部

</div>

3) taglib指令:引入一个标签库,明天再细讲

4.动作

1. include动作:把其它文件包含到当前jsp文件中,作用和include指令相同。

Incluce动作包含和include指令包含的区别:

1)包含的时间不同: include指令是在被包含文件和主文件内容合并后,在翻译成servlet(java类)的时候把文件包含进来.inlude动作是在请求主文件时就把文件包含进来。

动作包含要早于指令包含。

2)翻译的过程不同:include指令包含时,被包含文件和主文件合并在一起翻译,只会产生主文件翻译后的java类;include动作包含时,被包含文件是单独翻译的

实际项目中,用动作包含或者指令包含都可以

  1. forward动作:把当前的请求转发到其它资源上。

语法:

<jsp:forward page="相对 URL 地址" />

特点:是在服务器内部发生的跳转,地址栏上的url没有变(还是最初的url),用户并不知道已经发生了跳转.只能转发到当前项目的资源上

可以连续转发n次,但是浏览器的url始终不变(第1次请求的url)

隐式对象(重点)

Jsp隐式对象又叫内置对象,是web服务器给jsp页面提供的对象,我们可以直接使用这些对象.9个隐式对象分为如下几类:

第1类:作用域对象

作用域即作用范围,作用域对象有4个:request,session,page,application

第2类:输出对象,out

第3类:响应对象,response

第4类:其它对象,config,pageContext和exception

作用域对象4个:

request:请求对象,代表一次请求,它的作用域是一次请求,在request中存储的数据只能在一次请求中共享. 存数据的方法setAttribute(String name,Object value),取数据方法:

getAttribute(String name).只能在请求转发时,才能获取到request中的数据。

session:代表会话对象,会话就是浏览器和服务器之间多次请求和响应的过程。在session中存储的数据可以在多个请求中共享.

存数据: session.setAttribute("username", "李四");

取数据:

String username=(String) session.getAttribute("username");

application:代表web应用本身,即整个web项目的上下文执行环境.它的作用域是整个web项目,只要web服务器没有关闭,web项目就能访问,application就起作用.保存在application中的数据只要服务器没有关闭,就能够被所有会话共享。一个application包含多个会话。

page:代表当前页面自身。Page域中的数据只能在当前页面中共享,它的作用域是当前页面.

输出对象:out

out的println():此方法在输出内容后不会换行,而是产生一个空格

out的print():此方法可以输出任意类型的值

out的write():此方法只能输出字符数据,要么是字符串,要么是字符

例如:

<%

out.print("aaaa");

out.println("bbbb");

out.println("cccc");

out.write(97); //输出小写字母a

%>

响应对象:response

<%

String contentType = response.getHeader("Content-Type");

out.print("响应的内容类型:" + contentType);//在servlet里能测出来

int status = response.getStatus();

out.print("响应的状态码:" + status);//200

//重定向:即跳转到其它资源,它和转发区别是:重定向会改变地址栏的url(有新的请求)

response.sendRedirect("index.jsp");

%>

表单处理(超级重点)

表单处理就是获取从表单提交过来的数据,提交表单的请求方式:GET和POST.

针对GET提交,如果请求参数的值是中文,会产生乱码。

解决GET提交的中文乱码问题的方法有2种:

第1种:将获取的参数值先转换为byte[],再封装成新的字符串

<%

//获取请求参数的值

String sitename= request.getParameter("sitename");

String url= request.getParameter("url");

sitename= new String(sitename.getBytes("ISO8859-1"),"UTF-8");

%>

第2种:修改server.xml文件(直接找到Servers项目下的sever.xml去修改),在

Connector节点上添加一个属性URIEncoding=”UTF-8”

c94c9e441e93abd066f0fa6bfe90e703.png

解决POST提交的中文乱码问题:在第一次获取请求参数的代码前加上request.setCharacterEncoding("UTF-8");

例如:

<%

//解决POST请求的中文乱码

request.setCharacterEncoding("UTF-8");

//获取请求参数的值

String sitename = request.getParameter("sitename");

String url = request.getParameter("url");

%>

总结:获取请求参数的值有2个方法

getParameter(String name): 获取一个请求参数的值, name是请求参数名

getParameterValues(String name):获取一组请求参数的值,针对表单中的checkbox就用这个方法获取同名称的多个checkbox选中的一组值

<%

//解决POST请求的中文乱码

request.setCharacterEncoding("UTF-8");

//获取请求参数的值

String sitename = request.getParameter("sitename");

String url = request.getParameter("url");

String[] citys=request.getParameterValues("city");

for(String str:citys){

out.print("校区:"+str+"<br>");

}

%>

7.学生信息crud项目

在昨天项目的基础上,加入学生信息的添加,修改,删除功能

  1. 添加学生

添加学生的步骤如下:

  1. 在列表页面上给出添加的超链接

<a href="add.jsp">添加学生</a>

  1. 在添加页面add.jsp上用一个表单来收集输入的学生信息

<h2>添加学生</h2>

<form action="doAdd.jsp" method="post">

姓名:<input type="text" name="sname"><br>

性别:<input type="radio" name="sex" value="男">男

<input type="radio" name="sex" value="女">女<br>

年龄:<input type="text" name="age"><br>

<input type="submit" value="添加">

</form>

  1. 在doAdd.jsp上处理添加学生的请求

<%

//处理添加请求的步骤:

//1.获取表单中的所有请求参数的值

//解决post请求的中文乱码

request.setCharacterEncoding("UTF-8");

String sname = request.getParameter("sname");

String sex = request.getParameter("sex");

int age = Integer.parseInt(request.getParameter("age"));

//2.把参数的值封装成学生对象

Student stu = new Student(sname, sex, age);

//3.调用dao里面的insert方法,完成添加

StudentDao stuDao = new StudentDaoImpl();

int i = stuDao.insert(stu);

if (i > 0) {

//添加成功,重新请求list.jsp

response.sendRedirect("list.jsp");

}

%>

  1. 修改学生

修改学生的步骤如下:

1)在列表页面list.jsp上每一行学生数据后都加上”修改”超链接,将id参数传递到update.jsp上

<a href="update.jsp?sid=<%=stu.getSid() %>">修改</a>

  1. 在updte.jsp页面上回显学生信息

<%

//获取要修改的学生的id

int id=Integer.parseInt( request.getParameter("sid")) ;

//根据id查询一个学生对象

StudentDao stuDao=new StudentDaoImpl();

Student stu= stuDao.queryById(id);

%>

<form action="doUpdate.jsp" method="post">

<!-- 在修改页面上要回显学生编号,有2种方式: 1)用只读的文本框 2)用隐藏域 -->

编号:<input type="text" name="sid" value="<%=stu.getSid()%>" readonly><br>

姓名:<input type="text" name="sname" value="<%=stu.getSname() %>"><br>

性别:<input type="radio" name="sex" value="男" <%=stu.getSex().equals("男")?"checked":"" %>>男

<input type="radio" name="sex" value="女" <%=stu.getSex().equals("女")?"checked":"" %>>女<br>

年龄:<input type="text" name="age" value="<%=stu.getAge()%>"><br>

<input type="submit" value="修改">

</form>

回显:就是把原始数据再显示一次,如果是输入框(文本框,密码框),就用value属性来回显 value=”xxx”;如果是radio,就用checked来回显;如果是下拉列表框select,用selected来回显

  1. doUpdate.jsp上处理修改请求

<%

//防止POST请求的乱码

request.setCharacterEncoding("UTF-8");

//获取表单中的参数值

String sname = request.getParameter("sname");

String sex = request.getParameter("sex");

int age = Integer.parseInt(request.getParameter("age"));

//获取sid

int sid = Integer.parseInt(request.getParameter("sid"));

//把参数的值封装成学生对象

Student stu = new Student(sname, sex, age);

stu.setSid(sid);

//调用dao里的修改方法,完成修改

StudentDao stuDao = new StudentDaoImpl();

int i = stuDao.update(stu);

if (i > 0) {

//修改成功,重新请求list.jsp

response.sendRedirect("list.jsp");

}

%>

  1. 删除学生

删除学生的步骤如下:

  1. .在列表页面list.jsp每一行学生数据后添加一个删除的超链接,让它只响应js事件,不要发生跳转

<a href="javascript:void(0)" οnclick="deleteById(<%=stu.getSid() %>)">删除</a>

Js函数

<script>

function deleteById(id){

//使用confirm弹出一个确认取消对话框

var flag= confirm("是否确认删除此信息?");

if(flag){

//发请求给jsp页面去处理删除,相当于get请求, location.href:改变(设置)地址栏上的url

location.href="doDelete.jsp?sid="+id;

}

}

</script>

  1. doDelete.jsp页面上处理删除请求

<%

int sid=Integer.parseInt(request.getParameter("sid"));

//调用Dao里的删除方法,完成删除

StudentDao stuDao=new StudentDaoImpl();

int i= stuDao.delete(sid);

if(i>0){

//删除成功,重新请求list.jsp

response.sendRedirect("list.jsp");

}

%>

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值