一、导言
之前学习过的页面跳转的方法有转发和重定向。还可以使用<jsp:forward>
进行跳转。
语法:
<jsp:forward page="URL">
这种写法的效果跟转发完全一样,也能把转发传递下去,
二、实例分析
需求:编写添加新闻页面,实现添加新闻的功能。并使用<jsp:forward>实现页面跳转到新闻列表页面
实现思路:
1、编写添加新闻页面,实现添加新闻的功能
2、使用<jsp:forward>实现页面跳转到新闻列表页面
2.1第一步
当用户点击添加新闻的页面的时候,跳转到newsDetailCreateSimple.jsp这个页面:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<html>
<head>
<link href="<%=request.getContextPath() %>/css/common.css" rel="stylesheet" type="text/css" />
<script type="text/javascript" src="<%=request.getContextPath() %>/ckeditor/ckeditor.js"> </script>
</head>
<body>
<form name ="dataFrm" id="dataFrm" action="doAdd.jsp" method="post" enctype="multipart/form-data">
<table width="100%" border="0" cellspacing="5" cellpadding="0">
<thead>
<tr><td align="center" colspan="2" class="text_tabledetail2">增加新闻</td></tr>
</thead>
<tbody>
<tr>
<td style="text-align:right;" class="text_tabledetail2">分类</td>
<td style="text-align:left;">
<!-- 列出所有的新闻分类 -->
<select name="categoryId">
<option value="1">国内</option>
<option value="2">国际</option>
<option value="3">娱乐</option>
<option value="4">军事</option>
<option value="5">财经</option>
<option value="6">天气</option>
</select>
</td>
</tr>
<tr>
<td style="text-align:right;" class="text_tabledetail2">标题</td>
<td style="text-align:left;"><input type="text" name="title" value=""/></td>
</tr>
<tr>
<td style="text-align:right;" class="text_tabledetail2">作者</td>
<td style="text-align:left;"><input type="text" name="author" value=""/></td>
</tr>
<tr>
<td style="text-align:right;" class="text_tabledetail2">摘要</td>
<td style="text-align:left;"><textarea id="summary" name="summary" rows="8" cols="50"></textarea></td>
</tr>
<tr>
<td style="text-align:right;" class="text_tabledetail2">内容</td>
<td style="text-align:left;">
<div id="xToolbar"></div>
<textarea id="newscontent" name="newscontent" rows="8" cols="30" class="ckeditor"></textarea></td>
</tr>
<tr>
<td style="text-align:right;" class="text_tabledetail2">上传图片 </td>
<td style="text-align:left;"><input type="file" name="picPath" value=""/></td>
</tr>
<tr>
<td style="text-align:center;" colspan="2">
<button type="submit" class="page-btn" name="save">保存</button>
<button type="button" class="page-btn" name="return" onclick="javascript:location.href='newsDetailList.jsp'">返回</button>
</td>
</tr>
</tbody>
</table>
</form>
</body>
</html>
2.2第二步
1、在newsDetailCreateSimple.jsp这个页面输入新闻信息之后,把这些信息提交给数据处理页面doAdd.jsp,在数据处理页面上把这些数据保存到数据库之后,再进行重定向。
2、在newsDetailCreateSimple.jsp页面上可以看到时没有id这个属性的,但是之前在写dao方法的时候的增加新闻是有id这个属性的,所以要先把这个方法里面的id给去掉:
public void addNews(News news){
String sql = "INSERT INTO news_detail(categoryId, title, " +
"summary,content,author, createDate) VALUES(?,?,?,?,?,?);";
Object[] params = {news.getCategoryId(), news.getTitle(), news.getSummary(),news.getContent(), news.getAuthor(),news.getCreateDate()};
int i = this.executeUpdate(sql, params);
if (i > 0) {
System.out.println("插入资源成功!");
}
this.closeSource();
}
3、页面掉的是Service层的方法,但是之前并没有在该层级写这个方法,所以要加上。此时因为之前写的dao层级的添加新闻的方法是没有返回值的,可以把dao层级的这个方法的返回值设置为布尔型,方便Service层级调用。
dao层级的增加新闻方法的具体代码如下:
public boolean addNews(News news){
boolean flag = false;
String sql = "INSERT INTO news_detail(categoryId, title, " +
"summary,content,author, createDate) VALUES(?,?,?,?,?,?);";
Object[] params = {news.getCategoryId(), news.getTitle(), news.getSummary(),news.getContent(), news.getAuthor(),news.getCreateDate()};
int i = this.executeUpdate(sql, params);
if (i > 0) {
System.out.println("插入资源成功!");
flag = true;
}
this.closeSource();
return flag;
}
在service层级添加增加新闻的方法(接口略,实现类代码如下)
package cn.kgc.Service.implement;
import java.util.List;
import cn.kgc.Service.NewsService;
import cn.kgc.dao.NewsDao;
import cn.kgc.dao.implement.NewsDaoImpl;
import cn.kgc.pojo.News;
public class NewsServiceImpl implements NewsService{
private NewsDao newsdao;
public NewsServiceImpl(){
newsdao = new NewsDaoImpl();
}
public List<News> getAllNews() {
return newsdao.getAllNews();
}
public boolean addNews(News news) {
return newsdao.addNews(news);
}
}
数据处理界面的代码:
<%@page import="com.kgc.pojo.News"%>
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<%@include file="../common/common.jsp" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>My JSP 'doAdd.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
</head>
<body>
<%
// 点击增加按钮后跳转的页面,在该页面需要调用后台的新闻增加功能
// 增加成功后要跳转到新闻列表页面admin.jsp
// 增加失败后要跳转到增加新闻页面newsDetailCreateSimple.jsp
request.setCharacterEncoding("utf-8");
// 从表单中获取提交的数据
News news = new News();
String test = request.getParameter("categoryId");
news.setCategoryId(Integer.parseInt(test));
String title = request.getParameter("title");
String author = request.getParameter("author");
String summary = request.getParameter("summary");
String newscontent = request.getParameter("newscontent");
// 将以上数据封装到一个新闻对象里面
news.setTitle(title);
news.setAuthor(author);
news.setSummary(summary);
news.setContent(newscontent);
news.setCreateDate(new Date());
// 调用后台方法将news新闻对象保存到数据库中
boolean flag = newsService.add(news);
// 这个地方不把跳转写到尖括号百分号里面的原因是:
// 跳转操作是一个标签,标签不能写在这里面
if (flag) {
%>
<jsp:forward page="newsDetailList.jsp"></jsp:forward>
<%
} else {
%>
<jsp:forward page="newsDetailCreateSimple.jsp"></jsp:forward>
<%
}
%>
</body>
</html>
三、Bug
3.1bug1
上面这段代码在运行的时候会出现错误,不知道为什么:
image.png
bug的源头在于数据来源页面form表单的提交方式,当使用post提交的时候,使用这种方式拿到的值为null,但是使用get的时候可以正确地拿到值。
这个跟这两种方式提交数据后数据的保存形式有关,这个地方可以先不细究,等到sverlet的时候再看。
3.2bug2
image.png不知道为什么。
3.3bug3
我自己写的newsTest无法部署到Tomcat上,而news确可以部署到上面.
这个可能是因为newsTest里面的项目也是导入的news,所以部署的时候只认一个。
网友评论