《Servlet应用开发课程设计》项目实验报告
项目名称:娱乐无限下载中心
指导老师:黄 铭
班 级: WEB11307第二组
地 点: J1B401
小组成员:叶佳陇、王月、李飞、袁梅
廖小飞、江伟、李占银、李虹颖、侯燕
王晶晶、林姣、宋晓、严映婷、饶琴英
徐小川、王婷、杨梅、王晓莉、魏海林
时间:18周,2012年12月31日---2013年01月04日
目录
1.1需求分析.........................................................................1
1.2项目设计..........................................................................2
1.2.1选择开发模型........................................................................2
1.2.2数据库设计.............................................................................2
1.3项目实施...........................................................................3
1.3.1创建web项目........................................................................3
1.3.2通用功能的实现......................................................................3
1.3.3普通用户功能的实现..............................................................3
1.3.4管理员功能的实现..................................................................3
1.4项目运行............................................................................4
1.4.1 Web项目的目录结构.............................................................4
1.4.2 Web项目的发布.....................................................................4
1.5个人总结............................................................................5
1.1需求分析
a.功能需求
<1>用户分为管理员和普通用户
<2> 对于普通用户:能够直接访问网站的内容,包括浏览排行榜、浏览所有信息、分类浏览、分页浏览也可进行下载信息,当浏览的较多时可以进行分页浏览。
<3> 对于管理员除了具有普通用的权利之外,还可以通过登陆进行信息的管理包括信息的添加、删除、修改
b.结构功能分析
1. src目录的结构
1.1 service 包(模型层):建立普通用户所实现的功能以及管理员所实现的功能以及他们的共享的功能.
UserService类中,包括获得下载次数排名前十位的数据信息获得数据库中的所有信息获得指定分类的数据库信息获得指定名称的数据信息。 CommonService:获得下载文件信息及下载文件是更新文件的下载次数的方法。 AdminService:实现各种业务罗就包括验证登录信息获得数据库中的所有信息添加信息检索单条信息修改信息等。
1.2 servlets 包(控制层):将后台的数据库和前台的界面进行连接LoginServlet验证登录信息。
AdminServlet实现信息的管理。
UserServlet根据用户的请求路径不同调用相应的模型去处理 请求并选择合适的视图层去响应客户端。
DownLoadServlet:进行对上传文件的下载。
1.3 util 包(实现通用功能的java类):前台数据库的建立
DBHelper创建数据库的链接创建语句对象设置SQL语句的参数返回查询操作的单条记录返回查询操作的多天记录执行更新语句管部数据库的连接。
1.2项目设计
1.2.2选择开发模型
本系统的开发基于MVC模式,其中模型层负责业务数据的表示和实现业务逻辑,用Java类实现;视图层用于与用户交互,由JSP页面实现,通过在JSP页面中使用EL和JSTL,避免了Java脚本的出现;控制器层完成流程控制,它接收来自视图层用户输入的数据并调用相应的模型进行处理,最后选择合适的视图去响应用户,控制器层用Servlet实现。
1.2.2 数据库设计
本系统的数据信息存储在SQL数据库服务器的数据库中,数据库中共有两张数据表,即admin和files,其中admin表用于存储管理员的登录信息,files表用于存储娱乐信息。
Admin表
Fils表
1.3项目实施
1.3.1 创建Web项目
利用myeclipse创建新的Web项目,名为ch4的目录结构如图3-1所示。其中,src目录的service包保存模型层的java类,servlets包保存控制器层的servlet,util包保存实现通用功能的java类;WebRoot目录下的admin文件夹保存与管理员操作相关的JSP页面,用户相关的JSP页面直接保存在WebRoot目录下,software文件夹保存上传的文件。
图 3—1 项目ch14的目录结构
1.3.2 通用功能的实现
系统的通用功能包括数据库访问、分页处理和文件的上传/下载,这些功能在模型层通过Java语言实现。
A.数据库访问
数据库访问操作封装在util.DBUtil类中,包括创建数据库连接、创建语句对象、设置SQL语句的参数、返回查询操作的单条记录、返回查询操作的多条记录、执行更新语句、关闭数据库连接等功能。
文件名:DBUtil.java
package util;
import java.sql.*;
import java.util.*;
publicclass DBUtil {
private Connection conn=null;
private PreparedStatement pstmt=null;
private ResultSet rs=null;
private String url="jdbc:odbc:music";
privateint pageSize=3;
//获取连接对象
private Connection getConnection(){
try{
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
conn=DriverManager.getConnection(url,"root","root");
}catch(ClassNotFoundException e){
e.printStackTrace();
}catch(SQLException e){
e.printStackTrace();
}
return conn;
}
//获取语句对象
private PreparedStatement getPreoareStatement(String sql){
try{
pstmt=getConnection().prepareStatement(sql);
}catch(SQLException e){
e.printStackTrace();
}
return pstmt;
}
//给pstmt的SQL语句设置参数(要求参数以数组形式给出)
privatevoid setParams(String sql,Object[] params){
pstmt=this.getPreoareStatement(sql);
for(int i=0;i<params.length;i++)
try{
pstmt.setString(i+1,(String) params[i]);
}catch(SQLException e){
e.printStackTrace();
}
}
//执行数据库查询操作,返回结果的记录数
privateint getTotalRows(String sql,Object[] params){
int totalRows=0;
String countSQL="select count(*)from("+sql+") as temp";
try{
this.setParams(countSQL,params);
ResultSet rs=pstmt.executeQuery();
if(rs.next())
totalRows=rs.getInt(1);
}catch(SQLException e){
e.printStackTrace();
}finally{
close();
}
return totalRows;
}
//执行数据库查询操作时,将返回的结果封装到List对象中
public List getList(String sql,Object[]params){
List list=new ArrayList();
try{
this.setParams(sql,params);
ResultSet rs=pstmt.executeQuery();
ResultSetMetaData rsmd=rs.getMetaData();
while(rs.next()){
Map m=new HashMap();
for(int i=1;i<=rsmd.getColumnCount();i++){
String colName=rsmd.getColumnName(i);
int type=rsmd.getColumnType(i);
m.put(colName,rs.getString(colName));
}
list.add(m);
}
}catch(SQLException e){
e.printStackTrace();
}finally{
close();
}
return list;
}
//执行数据库查询操作时将返回的结果封装到Map对象中
public Map getMap(String sql,Object[] params){
List list=getList(sql,params);
if(list.isEmpty())
returnnull;
else
return(Map)list.get(0);
}
//分页显示查询结果时,将当前页中的所有信息封装到pageBean中
public PageBean getPageBean(String sql,Object[] params,int curPage){
String newSql=sql+"limit"+(curPage-1)*pageSize+","+pageSize;
List data=this.getList(newSql,params);
PageBean pb=new PageBean();
pb.setCurPage(curPage);
pb.setPageSize(pageSize);
pb.setTotalRows(getTotalRows(sql,params));
pb.setData(data);
return pb;
}
//更新数据库时调用的update()方法
publicint update(String sql,Object[] params){
int recNo=0;
try{
setParams(sql,params);
recNo=pstmt.executeUpdate();
}catch(Exception e){
e.printStackTrace();
}finally{
close();
}
return recNo;
}
//关闭对象
privatevoid close(){
try{
if(rs!=null)
rs.close();
if(pstmt!=null)
pstmt.close();
if(conn!=null)
conn.close();
}catch(SQLException e){
}
}
}
B.分页处理
分页后的数据保存在util.PageBean中,该信息通过util.DBUtil类的PageBean的getPageBean()方法得到。
文件名:PageBean.java
package util;
import java.util.List;
publicclass PageBean {
privateint curPage;
privateint totalPages;
privateint totalRows;
privateint pageSize;
private List data;
publicint getCurPage(){
if(curPage>getTotalPages()){
curPage=getTotalPages();
}elseif(curPage<1){
curPage=1;
}
return curPage;
}
publicvoid setCurPage(int curPage){
this.curPage=curPage;
}
publicint getTotalPages(){
if(totalRows%pageSize==0){
totalPages=totalRows/pageSize;
}else{
totalPages=totalRows/pageSize+1;
}
return totalPages=totalPages;
}
publicvoid setTotalPages(int totalPages){
this.totalPages=totalPages;
}
publicint getTotalRows(){
return totalRows;
}
publicvoid setTotalRows(int totalRows){
this.totalRows=totalRows;
}
publicint getPageSize(){
return pageSize;
}
publicvoid setPageSize(int pageSize){
this.pageSize=pageSize;
}
public List getData(){
return data;
}
publicvoid setData(List data){
this.data=data;
}
}
C.文件的上传和下载
文件的上传的下载功能封装在util.FileUtil类中,提供了实现文件上传和下载的通用方法。
文件名:FileUtil.java
package util;
import java.io.*;
import java.util.*;
import javax.servlet.*;
import javax.servlet.http.*;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.FileUploadBase.SizeLimitExceededException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
public class FileUtil {
private Map parameters = null;
private Map file = null;
private long max_size = 30*1024*1024;
public FileUtil() {
parameters = new HashMap();
file = new HashMap();
}
public int upload(ServletContext servletContext, HttpServletRequest request, HttpServletResponse response, String uploadPath) throws IOException{
DiskFileItemFactory diskFileItemFactory = new DiskFileItemFactory();
diskFileItemFactory.setSizeThreshold(4096);
ServletFileUpload fileUpload = new ServletFileUpload(diskFileItemFactory);
fileUpload.setSizeMax(max_size);
fileUpload.setHeaderEncoding("GBK");
response.setContentType("text/html;charset=GBK");
PrintWriter out = response.getWriter();
List fileList = null;
try {
fileList = fileUpload.parseRequest(request);
} catch (FileUploadException e) {
if (e instanceof SizeLimitExceededException) {
System.out.println("文件大小超过" + max_size + "字节");
return 0;
}
e.printStackTrace();
}
Iterator fileItr = fileList.iterator();
while (fileItr.hasNext()) {
FileItem fileItem = null;
String sourceFilePath = null;
String sourceFileName = null;
String fileExt = null;
String filePath= null;
String realPath = null;
String fileName = null;
long size = 0;
fileItem = (FileItem) fileItr.next();
if (!fileItem.isFormField()) {
sourceFilePath = fileItem.getName();
size = fileItem.getSize();
if (!sourceFilePath.equals("") && size != 0) {
sourceFileName = sourceFilePath.substring(sourceFilePath.lastIndexOf("\\") + 1);
fileExt = sourceFileName.substring(sourceFileName.lastIndexOf(".") + 1);
long systemTime=System.currentTimeMillis();
filePath=uploadPath+"/"+systemTime+"."+fileExt;
realPath = servletContext.getRealPath(filePath);
try {
fileItem.write(new File(realPath));
} catch (Exception e) {
e.printStackTrace();
return 0;
}
file.put("size", String.valueOf(size));
file.put("filePath",filePath);
file.put("fileName", sourceFileName);
}
} else {
String fieldName = fileItem.getFieldName();
String value = fileItem.getString("GBK");
parameters.put(fieldName, value);
}
}
return 1;
}
public int download(ServletContext servletContext,HttpServletResponse response,Map file) throws IOException{
java.io.BufferedInputStream bis = null;
java.io.BufferedOutputStream bos = null;
try {
String filePath=(String)file.get("filePath");
String realPath=servletContext.getRealPath(filePath);
long fileLength = new File(realPath).length();
response.setHeader("Content-disposition", "attachment; filename=" + new String(((String)file.get("fileName")).getBytes("GBK"),"ISO8859-1"));
response.setHeader("Content-Length", String.valueOf(fileLength));
bis = new BufferedInputStream(new FileInputStream(realPath));
bos = new BufferedOutputStream(response.getOutputStream());
byte[] buff = new byte[2048];
int bytesRead;
while ((bytesRead = bis.read(buff, 0, buff.length))!=-1) {
bos.write(buff, 0, bytesRead);
}
} catch (IOException e) {
return 0;
} finally {
if (bis != null)
bis.close();
if (bos != null)
bos.close();
}
return 1;
}
public Map getFile() {
return file;
}
public Map getParameters() {
return parameters;
}
public void setMax_size(long max_size) {
this.max_size = max_size;
}
}
模型层的service.CommonService类提供了获得下载文件信息及下载文件时更新文件下载次数的通用方法。
文件名:CommonService.java
package service;
import util.*;
import java.util.*;
import java.io.*;
public class CommonService {
private DBUtil db=new DBUtil();
public Map getDownLoadFile(String id){
String sql="select filePath,fileName from files where id=?";
return db.getMap(sql, new Object[]{id});
}
public void updateHits(String id){
String sql="update files set hits=hits+1 where id=?";
db.update(sql, new Object[]{id});
}
}
控制器层的servlet.DownLoadServlet类用于处理用户的下载请求,完成下载文件信息的获取,调用util.FileUtil类的下载方法完成文件的下载动作,以及更新文件的下载次数。
文件名:DownLoadServlet.java
package servlets;
import util.*;
import java.io.*;
import java.util.*;
import javax.servlet.*;
import javax.servlet.http.*;
import service.CommonService;
public class DownLoadServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doPost(request, response);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String id=request.getParameter("id");
CommonService cs=new CommonService();
Map file=cs.getDownLoadFile(id);
FileUtil fu=new FileUtil();
int r=fu.download(this.getServletContext(), response, file);
if(r==1)
cs.updateHits(id);
}
}
1.3.3 普通用户功能的实现
普通用户功能包括浏览排行榜、浏览所有信息、分类浏览和分类搜索。
A.模型层的实现
实现普通用户功能的业务逻辑被封装在模型层的service.UserService类中,包括获得下载次数排名前10位的数据信息、获得数据库中所有的信息、获得指定分类的数据信息、获得指定分类和指定名称的数据信息等。
文件名:UserService.java
package service;
import util.*;
import java.util.*;
import java.io.*;
public class UserService {
private DBUtil db=new DBUtil();
//获得所有信息的PageBean对象
public PageBean listAll(int curPage){
String sql="select * from files order by lastModified desc";
return db.getPageBean(sql, new Object[]{}, curPage);
}
//获得下载次数排名前10位的信息
public List topList(){
String sql="select id,name,hits from files where hits!=0 order by hits desc limit 0,10";
return db.getList(sql, new Object[]{});
}
//通过id获得单条数据信息
public Map getById(String id){
String sql="select * from files where id=?";
return db.getMap(sql, new Object[]{id});
}
//获得指定类型的数据信息的PageBean对象
public PageBean listSort(String type, int curPage) {
String sql=null;
if(type==null || type.equals("")){
sql="select * from files order by type";
return db.getPageBean(sql, new Object[]{}, curPage);
}else{
sql="select * from files where type=?";
return db.getPageBean(sql, new Object[]{type}, curPage);
}
}
//获得指定类型和指定名称的数据信息的PageBean对象
public PageBean search(String type,String name,int curPage){
String sql=null;
if(type==null || type.equals("")){
if(name==null || name.equals("")){
sql="select * from files order by type";
return db.getPageBean(sql, new Object[]{}, curPage);
}else{
sql="select * from files where name like ?";
return db.getPageBean(sql, new Object[]{"%"+name+"%"}, curPage);
}
}else{
if(name==null || name.equals("")){
sql="select * from files where type=?";
return db.getPageBean(sql, new Object[]{type}, curPage);
}else{
sql="select * from files where type=? and name like ?";
return db.getPageBean(sql, new Object[]{type,"%"+name+"%"}, curPage);
}
}
}
}
B.控制器层的实现
普通用户功能的控制器层由servlets.UserServlet类实现,完成根据用户的请求路径调用相应的模型去处理请求,并选择合适的视图层文件响应用户。
文件名:UserServlet.java
package servlets;
import util.*;
import java.util.*;
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import service.UserService;
public class UserServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doPost(request, response);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding("GBK");
String requestPath=request.getRequestURI();
int i=requestPath.lastIndexOf('/');
String path=requestPath.substring(i);
RequestDispatcher rd=null;
UserService us=new UserService();
if(path.equals("/listAll")){
String page = request.getParameter("page");
int curPage = 0;
if (page == null || page.length() < 1) {
curPage = 1;
} else {
curPage = Integer.parseInt(page);
}
PageBean pageBean=us.listAll(curPage);
request.setAttribute("pageBean", pageBean);
rd=request.getRequestDispatcher("/listAll.jsp");
rd.forward(request, response);
}else if(path.equals("/top")){
List top=us.topList();
request.setAttribute("top", top);
rd=request.getRequestDispatcher("/topList.jsp");
rd.forward(request, response);
}else if(path.equals("/show")){
String id=request.getParameter("id");
Map file=us.getById(id);
request.setAttribute("file", file);
rd=request.getRequestDispatcher("/showFile.jsp");
rd.forward(request, response);
}else if(path.equals("/sort")){
String type=request.getParameter("type");
String page = request.getParameter("page");
int curPage = 0;
if (page == null || page.length() < 1) {
curPage = 1;
} else {
curPage = Integer.parseInt(page);
}
PageBean pageBean=us.listSort(type,curPage);
request.setAttribute("pageBean", pageBean);
rd=request.getRequestDispatcher("/sortList.jsp");
rd.forward(request, response);
}else if(path.equals("/search")){
String type=request.getParameter("type");
String name=request.getParameter("name");
String page = request.getParameter("page");
int curPage = 0;
if (page == null || page.length() < 1) {
curPage = 1;
} else {
curPage = Integer.parseInt(page);
}
PageBean pageBean=us.search(type,name,curPage);
request.setAttribute("pageBean", pageBean);
rd=request.getRequestDispatcher("/searchList.jsp");
rd.forward(request, response);
}
}
}
C.视图层的实现
(1)首页——index.jsp
(2) 浏览排行榜有信息——listAll.jsp
(3)排行榜——toplist.jsp
(4)查看排行榜中某文件的详细信息——showFile.jsp
(5)信息分类浏览——sortLis.jsp
(6)分类搜索——searchList.jsp
1.3.3 管理员功能的实现
管理员登录后将浏览到所有信息,并且可以信息进行添加、修改、删除。
A.模型层的实现
实现管理员功能的业务逻辑被封装在模型层的service.AdminService类中,包括验证登录信息、获得数据库所有信息、添加信息、检索单条信息、修改信息等
文件名:AdminService.java
package service;
import util.*;
import java.util.*;
import java.io.*;
public class AdminService {
private DBUtil db=new DBUtil();
//验证登录信息
public boolean checkLogin(String username,String password){
String sql="select * from admin where username=? and password=?";
Map m=db.getMap(sql, new Object[]{username,password});
if(m==null)
return false;
else
return true;
}
//添加信息
public int add(Map file,Map parameters){
int result=0;
Object name=parameters.get("name");
Object size=file.get("size");
String hits="0";
Object type=parameters.get("type");
Object description=parameters.get("description");
Object filePath=file.get("filePath");
Object fileName=file.get("fileName");
String sql="insert into files values(null,?,now(),?,?,?,?,?,?)";
result=db.update(sql, new Object[]{name,size,hits,type,description,filePath,fileName});
return result;
}
//获得所有信息的PageBean对象
public PageBean list(int curPage){
String sql="select id,name,lastModified,size,hits,description from files";
return db.getPageBean(sql, new Object[]{}, curPage);
}
//通过id检索单条信息
public Map getById(String id){
String sql="select * from files where id=?";
return db.getMap(sql, new Object[]{id});
}
//更新上传文件信息
public int updateFile(String realPath,Map file,Map parameters){
int result=0;
File f=new File(realPath);
f.delete();
String sql="update files set size=?,hits=?,filePath=?,fileName=? where id=?";
result=db.update(sql, new Object[]{file.get("size"),"0",file.get("filePath"),file.get("fileName"),parameters.get("id")});
return result;
}
//更新信息
public int updateInfo(Map parameters){
Object id=parameters.get("id");
Object name=parameters.get("name");
Object type=parameters.get("type");
Object description=parameters.get("description");
String sql="update files set name=?,lastModified=now(),type=?,description=? where id=?";
return db.update(sql, new Object[]{name,type,description,id});
}}
B、控制器层的实现
登录验证控制器层由servlets.loginServlet实现,其他的信息管理功能的控制器层由servlets.AdminServlet实现
文件名:LoginServlet.java
(代码略)
文件名:AdminServlet.java
package servlets;
import util.*;
import java.util.*;
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import service.AdminService;
public class AdminServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doPost(request, response);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding("GBK");
String requestPath=request.getRequestURI();
int i=requestPath.lastIndexOf('/');
String path=requestPath.substring(i);
RequestDispatcher rd=null;
AdminService as=new AdminService();
if(path.equals("/add")){
String uploadPath="/software";
FileUtil fu=new FileUtil();
int r=fu.upload(this.getServletContext(), request, response, uploadPath);
if(r==1 && as.add(fu.getFile(),fu.getParameters())==1){
request.setAttribute("result", "添加成功!");
}else{
request.setAttribute("result", "添加失败!");
}
rd=request.getRequestDispatcher("/admin/result.jsp");
rd.forward(request, response);
}else if(path.equals("/update")){
String id=request.getParameter("id");
Map file=as.getById(id);
request.setAttribute("file", file);
rd=request.getRequestDispatcher("/admin/update.jsp");
rd.forward(request, response);
}else if(path.equals("/dealUpdate")){
int result=0;
String uploadPath="/software";
FileUtil fu=new FileUtil();
int r=fu.upload(this.getServletContext(), request, response, uploadPath);
if(r==1){
Map file=(Map)fu.getFile();
Map parameters=(Map)fu.getParameters();
if(!file.isEmpty()){
String realPath=this.getServletContext().getRealPath((String)parameters.get("filePath"));
result=as.updateFile(realPath,file,parameters);
}
result=as.updateInfo(parameters);
}
if(result==1){
request.setAttribute("result", "更新成功!");
}else{
request.setAttribute("result", "更新失败!");
}
rd=request.getRequestDispatcher("/admin/result.jsp");
rd.forward(request, response);
}else if(path.equals("/delete")){
}else if(path.equals("/list")){
String page = request.getParameter("page");
int curPage = 0;
if (page == null || page.length() < 1) {
curPage = 1;
} else {
curPage = Integer.parseInt(page);
}
PageBean pageBean=as.list(curPage);
request.setAttribute("pageBean", pageBean);
rd=request.getRequestDispatcher("/admin/list.jsp");
rd.forward(request, response);
}
}
}
C、视图层的实现
(1)登录页面——login.jsp
(2)管理页面——list.jsp
(3)添加信息——add.jsp
(4)修改信息——update.jsp
(5)结果显示——result.jsp
(6)删除信息——delete.jsp
1.4项目运行
14.4.1 Web项目的目录结构
Web项目ch14的最终目录结构如图14-12所示。
14.4.2 Web项目的发布
将web项目发布到tomcat服务器上可以通过打包、安装的方式。
1、打包
Web项目发布时,需要将webRoot目录下的所有内容打包到一个war文件中。使用WAR文件更新以便于web项目的发布和设置,便于web应用的移植。
打包时,需要进入web项目的webroot目录下,运行如下命令:
Jar cvf ch14.war.
2、安装
将WAR文件复制到$CATALINA-HOME\webapps目录下即可,然后再浏览器地址栏中输入URL:http://locahost:8080/ch14,即可访问web应用。
1.5 个人总结
为了了解自己对本学期知识的掌握情况,我们进行了十四章的项目训练。其项目设计:一、项目系统的开发基于MVC模式。二、数据库设计。让我们清楚的了解到系统的运行机制与数据库的建立。
这其中也有些文件需要我们自己去完成。这个项目所蕴含的知识几乎囊括本书的所有内容,极具完整性。最后在与对数据库的链接遇到了问题,用JDBC-ODBC的链接方法链接不上,只能用我们还没有学过的链接MySQL的方法链接MySQL,以MySQL作为数据库,这让我清楚的了解到自己的不足。
-------------李占银
突然而来的综训,感到非常棘手。在团队成员的帮助下才勉强完成作业,这是这学期第一次敲代码,但是经过这次的综训,还是学到了不少的jsp的知识。团队的力量是最大的,在这次综训中,我干的很少,其余的都是团队做的,我觉得一个人很难把事干好,集体的才能做到完美
-------------李飞
通过这次的《Servlet应用开发》项目实战,让我基本掌握Servlet基础、Servlet会话跟踪、Servlet监听和Servlet过滤等知识,并将所学的重要技能融会贯通,更加全面的,熟练的掌握使用Servlet的基础方法和技巧,虽然还是有些不懂,我相信在以后的学习过程中,我会更加深刻。
此次开发一个基于MVC模式的Java Web项目—娱乐无限下载中心,实现娱乐信息的共享和管理。其中模型层(M)负责业务数据的表示和实现业务逻辑,用Java类实现;视图层(V)用于与用户交互,由JSP页面实现,通过在JSP页面中使用EL和JSTL,避免了Java脚本的实现;控制器层(C)完成流程控制,它接收来自视图层用户输入的数据并调用相应的模型进行处理,最后选择合适的视图去响应用户,控制层用Servlet实现。
在所有代码都已完成,实现数据库连接,本章节使用的数据库是MYSQL,而我们所学的是SQL Server,这给我们连接数据库带来不少麻烦,不知从何下手,通过和小组成员的讨论,我们对MYSQL有一点点的掌握,在大家的努力之下,将数据库成功连接。完成了这次项目。
回想这次做项目的过程,在学习过程中没有认真,导致了很多时候不知该怎样做这个项目,通过全体组员的共同努力,还是完成了任务,也让我学到了不少知识,在今后的学习过程中我会认真的学习。
-------------李虹颖
经过几天的综训,我更加熟悉掌握了servlet数据处理、重定向和请求转发等的使用。和servlet监听和serl\vlet过滤的基本技术,以及怎么连接到数据库,当然在做这个项目的过程中我们也遇到过很多各种各样的问题,比如说进行数据检索后,再次显示查询结果时就出问题了等等,但是通过我们团队的合作努力我们通过上网查询,去图书馆找资料,把这些问题都统统解决了。下面举几个例子说说我们在做过程中遇到的几个问题以及我们的解决方法:
1)进行数据检索后,再次显示查询结果是,数据显示不出来了,这是我们就用了POST提交,var form=document.getElementById(“form1”);
Form.action=”showaction.action”;form.submit();
2)当我们运行时出现过这么一个错误提示:The import javax.servlet cannot be resolved
我们找了很久都找不到错误的地方,原来是包放错位置了,这个包应该是在tomcat里面,引导这个包正确的语句是import javax.servlet.*;而不是import java.servlet.*;
3)运行JSP后,无法转入servlet,报告http404错误。这个问题是路径问题,还有就是web.xml的WEB-INF文件必须与JSP文件处于同一目录下。
4)
总之在做过程中我们也是遇到了很多很多问题的,但是只要努力我们最后还是把项目完成了,在这过程中把我以前不大懂的地方做了很好的补充,也很好的锻炼了我们动手制作的能力。
---------------林姣
通过为期一周的JSP综训,使我对JSP的知识有了更深的理解,在这一周中,我们班上同学分成了两个小组,每个小组都要完成老师布置的任务。在刚开始时,组长就给大家分配好了任务,每个人都有自己要完成的任务,组员们团结一致,在很短的时间内疚完成了自己的任务,把代码敲好发给要调试的那个同学,在调试的过程中出现了些许的问题,但是大家不放弃,翻阅资料,请教老师,最终还是很顺利的完成了任务。
在这周,我了解到对于开发基于MVC模式的Web应用时,视图层可以选择JSP页面实现,通过在JSP页面中使用JSTL和EL避免了Java脚本的出现,可以选择Servlet作为控制器,负责流程控制、模型的调用和视图的选择;模型层可以使用Java类来实现,完成相应的业务逻辑。开发过程中要注意路径和书写正确,以及在JSP页面中对于以get方式提交的中文参数的特殊处理。而在结束时可以使用jar命令对其打包,打包后的应用便于发布和移植。
---------------宋晓
在本次JAVA项目中,小组分工完成了创建WEB项目,每个人完成一部分代码。
利用MyEclips创建新的Web项目。其中,src目录的service包保存模型层Java类,servlets包保存控制器层的Servlet,util包保存实现通用功能的JAVA类;WEBROOT目录下的admin文件夹保存与管理员操作相关的JSP页面,用户相关的JSP页面直接保存在WEBROOT目录下,software文件夹保存上传文件。
管理员功能实现——模型层的实现:
实现管理员功能的业务逻辑被封装在模型层的service.AdminSvice类中。
--------------王晶晶
由于是分组作业,而需要输入的代码很多,所以每个小组选出一个组长,由组长来分配任务,我的任务很简单,就是负责sortList.jsp的输入。在输入过程中,遇到一些问题,最突出的问题就是输入时有些代码的拼写不正确,特别是一些符号容易被漏掉。再一点就是有些代码看不懂,还需努力
----------------王婷
本次项目实战中项目的功能主要有数据库访问、分页处理、文件的上传和下载等功能,其中实现了一些普通用户的功能、管理员功能的实现,例如:模型层的实现、控制器层的实现和试图层的实现,
我所负责的代码部分为“修改信息——update.jsp”,这部分代码实现了文件的修改
-------------王晓莉
通过本章的学习,能够了解MVC模式开发WEB应用的流程,综合运用JAVA Web开发的相关知识和技术完成项目开发。并且通过实训完成这一课程的学习和应用编程实践环节。熟练掌握Servlet基础、Servlet会话跟踪、Servlet监听和Servlet过滤等知识,并将所学的重要技能融会贯通,更加全面的,熟练的掌握使用Servlet的基础方法和技巧。重点掌握JSP中路径的正确书写方式,以get方式提交请求时传递中文参数的方法、文件的上传、下载功能和分页功能,并能够运用软件工程的相关知识对项目进行构思、设计、实施和运行。书到用时方恨少。通过这次的学习,我找到了自己的很多不足,自己需要提升的地方有很多,今后还需要多多努力学习。
---------------王月
上周,在我们小组的共同努力下,我们成功完成了这次的实训项目。这个项目主要是通过Servlet技术做一个可以下载和上传音乐的软件。这个软件里面包含了很多知识,如:数据库的访问、文件的上传和下载、普通用户功能的实现等等。所以我们每个人都有着自己的任务。通过这次的任务我们知道了,一个好的程序是要通过团队合作完成的,我们一定会更加的努力。
--------------魏海林
通过本章的学习,能够了解基于MVC模式开发Web应用的流程,综合运用Java Web开发的相关知识和技术完成项目开发,重点掌握JSP中路径的正确书写方式。本系统的开发基于MVC模式,其中模型层负责业务数据的表示和实现业务逻辑。熟练掌握Servlet数据处理、重定向和请求转发、COOKIE和SESSION对象的创建使用以及ServletContexe接口的使用基础知识,掌握Servlet监听和Servlet过滤基本技术,掌握Servlet编程常使用的类的属性和方法。创建Web项目,通过功能的实现 普通用户功能的实现 管理员功能的实现 关键问题的说明。通过学习明白了,在掌握Servlet技术,并将所学的重要技能融会贯通,更加全面的,熟练的掌握使用Servlet的基础方法和技巧。培养我们的综合应用能力和解决实际问题的能力。
--------------徐小川
经过一周14章项目的训练,对MVC模式开发Web应用流程有了更进一步的了解,在整个程序的实现中,包括数据库访问、分页处理和文件的上传/下载,这些功能在模型层通过Java语言实现;登录验证的控制层由servlets.LoginServlet实现,其他的信息管理功能由servlets.AdminServlet实现;最后视图层可以选择JSP页面实现。将Web项目发布到Tomcat服务器上可以通过打包、安装的方式。
通过此次的项目,发现自己对知识点掌握的还不是很牢固,但同时也巩固了自己对知识点的认识,以前不懂的地方在项目的实现中通过与同学的交流也有了一定的了解。
通过本章的学习,能够运用软件工程的相关知识对项目进行构思、设计、实施和运行。
---------------杨梅
通过做这个项目,我感觉到了自身存在很大的不足,平时书上代码基本上都看得懂,但是放下书自己做时却无从下手,这个项目让我感觉最深的还是连接数据库,连接数据库的部分我弄了很久,最终还是经过全组重要成员讨论出来才做出来的,开始我打算经过改书上代码达到连接SQL Server 2005数据库但是我经过很久的调试还是没弄出来,最后经过讨论我们决定使用MySQL经过我们的努力将项目调试出来了。
在做这个项目的时候我感觉一个学期的理论知识,却无从下手,有几个代码书上是没有的,我们经过查资料翻书,仿写其他代码将项目调试成功,我感觉真的很不容易,但是我觉得这只是书上的成果,我想完成的效果是通过页面连接SQL Server 2005而不是MySQL,最遗憾的是这个目标还没有完成,但是我还会继续调试SQL Server的。通过这个项目我还感觉到这不仅仅是这学期的知识要用上,还必须需要以前的知识,还是数据库是让我最恼火的。包括连接和创建数据库,幸运的是这让我知道了连接数据库的方法。
这个项目让我学会的我想不仅是将它调试出来而已,而是让我能够举一反才是我想要的结果。
-------------叶佳陇
通过本周的学习,我了解了基于MVC模式开发Web应用的流程,综合运用Java Web开发的相关知识和技术完成项目开发,重点掌握JSP中路径的正确书写方式,以get方式提交请求时传递中文参数的方法、文件的上传/下载功能和分页处理功能,并哪能够运用软件工程的相关知识对项目进行构思、设计、实施和运行。
我们的项目综合运用了前面章节所学的内容,开发项目——娱乐无限下载中心,实现娱乐信息的共享和管理。本项目有两类用户角色:普通用户和管理用户。普通用户可以直接访问网站内容,包括浏览行榜、浏览所有信息、分类浏览和分类收索,同时可以对喜欢的信息进行下载。当浏览信息内容较多时,可以进行分页浏览。管理员用户除了具有普通用户的权限外,还可以通过登录来管理各项娱乐信息,包括信息的添加、修改和删除。
本系统的开发基于MVC模式,其中模型层(M)负责业务数据的表示和实现业务逻辑,用Java类实现;视图层(V)用于与用户交互,由JSP页面实现,通过在JSP页面中使用EL和JSTL,避免了Java脚本的出现;控制器层(C)完成流程的控制,它接收来自视图层用户输入的数据并调用相应的模型进行处理,最后选择合适的视图去响应用户,控制器层用Servlet实现。
项目的实施中有:
1.数据库访问 创建数据库连接、创建语句对象、设置SQL语句的参数、返回查询操作的单条记录、返回查询操作的多条记录、执行更新语句、关闭数据库等功能。
2.分页处理
3.文件的上传和下载
开发过程中要注意路经的正确书写,以及在JSP页面中对get方式提交的中文参数的特殊处理。Web应用开发完成后,可以使用jar命令对其打包,打包后的应用便于发布和移植。
-------------袁梅
本次小组的项目实战内容是基于MVC模式JavaWeb项目——娱乐无限下载中心,实现娱乐信息的共享和管理。熟练掌握Servlet基础、Servlet会话跟踪、Servlet监听和Servlet过滤等知识,并将所学的重要技能融会贯通,更加全面的,熟练的掌握使用Servlet的基础方法和技巧。因为页面很多,小组的每一个成员都有负责一个页面,这样就缩短了时间,提高了工作效率,在较短的时间内完成了项目。
在做项目期间遇见了很多问题,因为最后是将所有的知识点相集合,需要融会贯通,部分页面始终出现错误,最后发现犯的是一些小细节的错误,commons—fileupload组件没有安装,commons-fileupload-1.2.1.jar和commons-io-1.4.jar文件没有复制到项目目录的WEBINF/lib下。另外的一个问题就是数据库链接,起初用的是sqlserver2005,但对sqlserver2005不熟悉,始终链接不上,最后改成用mysql才将项目完成。
总而言之,一个项目的完成是需要团队合作完成的,再有就是做事要细心,不能老是去犯一些低级错误,当一条路行不通的时候就寻求另一条路,学会转弯。
-------------饶琴英
通过短短一周的实训操作训练,使我能够了解基于MVC模式开发Web应用的流程,在我们这个小组我主要负责的是分页处理PageBean.java的代码,这是一个典型的JavaBean,其中定义了5个属性:curPage,totalPages,totalRows,pageSize,List data;通过设置getXxx()和setXxx()方法对这些属性进行操作,main方法是为了测试JavaBean,写好的JavaBean在其他Java应用调用之前,可以使用main()方法来进行测试,在确认功能以后再加入到其他Java应用JSP程序中,同时测试PageBean.java。
虽说开始会觉得自己敲的代码比较简单,但是后来才发现正是出于自己对项目代码的轻视,导致书写上出现了一些小问题,以至于项目运行时出现了很多的问题,比如SQL连接上的问题,其实也正是有了这样经历过程才使自己对我们此次的项目开发过程也有了进一步的熟悉和掌握。并且知道掌握一些基本知识和理论以及一些基本知识技能的重要性,如熟练掌握Servlet数据处理、重定向和请求转发、COOKIE和SESSION对象的创建使用以及ServletContexe接口的使用基础知识,以及掌握Servlet监听和Servlet过滤基本技术与掌握Servlet编程常使用的类的属性和方法。能较熟练Servlet驻 API的两个包:javax.servlet和javax.servlet.http,根据数据发送方式,熟练地重写doGet()和doPost()方法。正确理解Servlet的生命周期,合理使用Servlet生命周期的init()、service()、destroy()方法。熟练实现Servlet读取表单数据、处理HTTP请求报头、设置HTTP响应报头,以及重定向和请求转发。同时,我也知道了这个项目的成功完成离不开我们小组每个成员的辛勤劳作,也深深的体会到团队的力量,希望以后我们每个队员能够更上一层楼!来完成质量更高更好的项目开发研究!
-------------侯燕
通过这次的《Servlet应用开发》项目实战,让我基本掌握Servlet基础、Servlet会话跟踪、Servlet监听和Servlet过滤等知识,并将所学的重要技能融会贯通,更加全面的,熟练的掌握使用Servlet的基础方法和技巧,虽然还是有些不懂,我相信在以后的学习过程中,我会更加深刻。
此次的项目自己参与当中也对其有了一定的了解,本系统的开发基于MVC模式,其中模型层(M)负责业务数据的表示和实现业务逻辑,用Java类实现;视图层(V)用于与用户交互,由JSP页面实现,通过在JSP页面中使用EL和JSTL,避免了Java脚本的出现;控制器层(C)完成流程的控制,它接收来自视图层用户输入的数据并调用相应的模型进行处理,最后选择合适的视图去响应用户,控制器层用Servlet实现。回想这次做项目的过程,在学习过程中没有认真,导致了很多时候不知该怎样做这个项目,通过全体组员的共同努力,还是完成了任务,也让我学到了不少知识,在今后的学习过程中我会认真的学习。
-------------江伟 通过完成该项目,了解完成一个java web开发项目的基本思维,能够了解基于MVC模式开发Web应用的流程图,综合运用Java Web 开发的相关知识和技术完成项目开发,重点掌握JSP中路径的正确书写方式,以get方式提交请求时传递中文参数的方法、文件的上传、下载功能和分页处理得功能,并能够运用软件工程的相关知识对项目进行构思、设计、实施和运行。
该项目是一个基于MVC模式的Java Web 项目,其中模式层负责数据的表示和业务逻辑用Java类实现(实现普通用户功能业务逻辑被封装在service.UserService类中,即获得数据库的数据信息);视图层用于用户交互,由JSP页面实现,通过在JSP页面使用EL和JSTL,避免了java脚本出现(通过listAll.jsp来浏览所有信息,以及topList.jsp所实现的下载排行榜的页面,以及login.jsp实现的登录界面管理员登录的权限);控制器层完成流程控制,它接受来自视图层用户输入的数据并调用相应的模式进行处理,最后选择合适的视图去影响用户,控制器层用Servlet实现(由serlvets.UserServlet类实现,完成根据用户的请求路径调用相应的模式去处理请求,并选择合适的视图层文件响应用户)。
除此之外该项目中数据库创建及链接也是重要的角色,相当于整个项目的核心,在完成该项目的同时,对数据库链接的知识是相当重要,因此在这过程中对数据库链接的知识掌握得更牢,在实战是更为熟练。在本次项目充分意识到完成一个项目,团队的合作是必不可少的。
-------------严映婷
经过几天的综训,我更加熟悉掌握了servlet数据处理、重定向和请求转发等的使用。和servlet监听和serl\vlet过滤的基本技术,以及怎么连接到数据库,当然在做这个项目的过程中我们也遇到过很多各种各样的问题,比如说进行数据检索后,再次显示查询结果时就出问题了等等,但是通过我们团队的合作努力我们通过上网查询,去图书馆找资料,把这些问题都统统解决了。
-------------廖小飞