一、JSP概述
jsp其实就是servlet。
二、JSP原理
三、JSP最佳实践以及request和session的区别
案例:实现一个登录界面,如果用户名以及密码正确跳到success.jsp,否则带回在login.jsp显示用户名或密码错误。
jsp的最佳实践:
jsp:展示用户数据
servlet:重点编写java逻辑(接收表单数据、处理业务逻辑、分发转向)
代码:
login.jsp
<% String msg = (String) request.getAttribute("msg");
if (msg!=null){
out.print(msg);
}
%>
<form action="/Login" method="post"/>
用户名:<input type="text" name="userName"/><br/>
密码:<input type="password" name="pwd"/><br/>
<input type="submit" value="提交">
</form>
LoginServlet.java
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 处理表单数据
String userName = req.getParameter("userName");
String pwd = req.getParameter("pwd");
req.getSession().setAttribute("name",userName);
// 处理业务逻辑
if("tom".equalsIgnoreCase(userName)&&"123".equals(pwd)){
// 分发转向
req.getRequestDispatcher("/success.jsp").forward(req,resp);
}else {
req.setAttribute("msg","您的用户名或者密码输入错误");
req.getRequestDispatcher("/login.jsp").forward(req,resp);
}
}
success.jsp
<body>
欢迎您:
<%
String name = request.getParameter("userName");
out.print(name);
%>
</body>
request和session的区别
首次从login.jsp填写用户名密码=》跳转到LoginServlet,sevlet进行处理,如果成功转发到success.jsp,否则转发到login.jsp
以上都是一次请求
问题:
如果想到了success.jsp页面以后,想通过一个超链接跳转回首页,并且在首页显示用户名,但这就是两次请求了,怎么办,?
答:在LoginServlet中getSession.setAtrribute(),创建一次session,就可以在login.jsp中拿到session.getAttribute()
记住,getAttribute()得到的是一个对象,要强转成string
代码:
LoginServlet.java
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 处理表单数据
String userName = req.getParameter("userName");
String pwd = req.getParameter("pwd");
req.getSession().setAttribute("name",userName);
// 处理业务逻辑
if("tom".equalsIgnoreCase(userName)&&"123".equals(pwd)){
// 分发转向
req.getRequestDispatcher("/success.jsp").forward(req,resp);
}else {
req.setAttribute("msg","您的用户名或者密码输入错误");
req.getRequestDispatcher("/login.jsp").forward(req,resp);
}
}
login.jsp
<body>
<% String msg = (String) request.getAttribute("msg");
if (msg!=null){
out.print(msg);
}
%>
<form action="/Login" method="post"/>
用户名:<input type="text" name="userName"/><br/>
密码:<input type="password" name="pwd"/><br/>
<input type="submit" value="提交">
</form>
<%
String name = (String)session.getAttribute("name");
if (name!=null) {
out.print(name);
}
%>
</body>
四、JSP
4.1 jsp的基本语法
4.1.1、小脚本 <% java代码 %>
4.1.2、表达式 <%= 2+3 %> 等价于out.print(2+3);
4.1.3、JSP注释
JSP注释:<%– 被注释的内容 –%> 特点:安全,省流量
网页注释:< !– 网页注释 –> 特点:不安全,费流量
4.2 jsp的三个指令
JSP指令(directive)是为JSP引擎而设计的,它们并不直接产生任何可见输出,而只是告诉引擎如何处理JSP页面中的其余部分。
page
include
taglib 标签指令
语法:
<%@ 指令名称 属性1=“属性值1” 属性2=“属性值2”。。。%>
4.2.1 Page
1.1、 isErrorPage: 是否创建throwable对象。默认是false;
1.2、 contextType: 等同于response.setContextType(“text/html;charset=utf-8”);
1.3、 pageEncoding: 告诉JSP引擎要翻译的文件使用的编码。
1.4、 isELIgnored: 是否支持EL表达式。 默认是false
pageEncoding和contexType的编码问题:
4.2.2 Include指令
静态包含:把其它资源包含到当前页面中。
<%@ include file=”/header.jsp” %>
动态包含:
< jsp : include page=”/header.jsp”>
两者的区别:翻译的时间段不同
前者:在翻译时就把两个文件合并
后者:不会合并文件,当代码执行到include时,才包含另一个文件的内容。
原则:能用静的就不用动的。
4.2.3 Taglib指令
作用:在JSP页面中导入JSTL标签库。替换jsp中的java代码片段。
<%@ taglib uri=”http://java.sun.com/jsp/jstl/core” prefix=”c” %>
4.3 jsp的6个动作
< jsp : include >
< jsp:include > 动态包含
下面两个可以结合使用
< jsp:forward> 请求转发
< jsp:param> 设置请求参数
< jsp : useBean>
< jsp : setProperty> 给指定的对象属性赋值
< jsp : getProperty >取出指定对象的属性值
案例代码:
1.jsp
<body>
<%
Student student = new Student();
student.setName("tom");
out.print(student.getName());
%>
//下面的与上面效果相同
<jsp:useBean class="com.jsp.action.Student" id="stu1"></jsp:useBean>
//set方法
<jsp:setProperty name="stu1" property="name" value="jerry"/>
//get方法
<jsp:getProperty name="stu1" property="name"/>
</body>
4.4 jsp的九大内置对象
指在JSP的<%=%> 和<% %>中可以直接使用的对象
4.5 pageContext(重要)
本身也是一个域对象:它可以操作其它三个域对象(request session application)的数据
void setAttribute(String name,Object o);
Object getAttribute(String name);
void removeAttribute(String name);
操作其它域对象的方法
void setAttribute(String name,Object o,int Scope);
Object getAttribute(String name,int Scope);
void removeAttribute(String name,int Scope);
scpoe的值:
PageContext.PAGE_SCOPE
PageContext.REQUEST_SCOPE
PageContext.SESSION_SCOPE
PageContext.APPLICATION_SCOPE
代码案例:
pageContext.java
<body>
<%
pageContext.setAttribute("p","pp");
request.getRequestDispatcher("/pageContext1.jsp").forward(request,response);
//pageContext可以操作其他三大域对象
pageContext.setAttribute("p","request",PageContext.REQUEST_SCOPE);
//等同于 req.setAttribute 其他session application 类似
%>
</body>
pageContext1.java
<body>
<%=pageContext.getAttribute("p")%>//取不到值,只能取到当前页面的值
</body>