实验三、简单Web应用程序设计(2学时)
4、实验内容
1、Java Web环境搭建和测试
提醒:如果安装的自带Tomcat的Netbeans,不需要这一步!
⑴ 安装Tomcat7 Web应用程序服务器
登录Apache Tomcat官网Apache Tomcat® - Welcome! 下载Tomcat7,建议下载压缩包格式32-bit Windows zip,将压缩包解压至硬盘根目录,例如:D:tomcat7。
⑵ 运行Netbeans IDE 7.4,依次选择菜单“工具”>“服务器”,进入到添加服务器界面。点击按钮,在d出的选择服务器界面中选择“Apache Tomcat”,点击“下一步”按钮。界面如图3-17所示:
图3-17 添加服务器
⑶ 在安装和登录详细信息界面中,浏览选择tomcat7安装根目录,在用户名口令处输入要添加的管理用户,选择“完成”按钮。如图3-18所示:
图3-18 配置信息
⑷ 到此为止,添加了Tomcat7 web服务器,在服务器设置界面中我们可以指定Tomcat服务器端口号,这里指定了“8088”(为了避免和系统占用的8080端口冲突,建议更换一个)。
图3-19 端口设置
⑸ 新建Java Web项目:进入到Netbeans IDE7.4环境,选择菜单“文件”>“新建项目”,在d出的对话框中选择“Java Web”类别,项目选择“Web应用程序”,点击“下一步”按钮,输入项目名称和选择项目要保存的路径。本例项目默认保存到C:UsersAdministratordocumentsNetBeansProjects目录。
⑹ 点击“下一步”按钮,进入到服务器和设置界面,如果已经在第⑵步中添加了Tomcat Web服务器,则在这里可以看到已经选择了Apache Tomcat服务器,上下文路径默认设置为/项目名称。点击“下一步”按钮,进入到“框架”选择界面,如果Web应用程序要使用某些框架,则可以在这里选择,否则,选择“完成”按钮。
⑺ 至此,新建项目工作完成。我们可以在IDE中看到新建的项目,默认添加了一个index.jsp文件。
⑻ 运行项目:选择工具栏上的图标或者选择菜单“运行”>“运行项目”,IDE开始在后台运行tomcat服务器,并打开默认浏览器显示运行结果。浏览器地址栏地址为http://localhost:8088/JavaWebTest/,其中http://localhost:8088/为web服务器的地址,JavaWebTest为web应用程序上下文路径。
思考:
① 喜欢专研的同学可能会问到,Netbeans IDE是如何和Tomca7服务器连接、管理和加载运行我们的Web项目呢?如果不知道,请去D:tomcat7confCatalinalocalhost 目录下一探究竟吧。
② 当我们运行web应用程序时,为什么能够自动加载项目中的index.jsp文件运行呢?
2、简单Web应用程序编写(此题在第1题的基础上编写)
⑴ 添加Sql Server驱动程序sqljdbc4.jar和JSTL核心标记库standard.jar、jstl.jar到库引用路径中。
在项目文件夹的WEB-INF目录下新建lib目录,然后将下载的三个库文件放到其中。
在项目资源管理器中展开库节点,然后在d出的菜单中选择“添加JAR/文件夹”,然后选择刚刚添加进WEB-INF/lib文件夹下的三个库文件,选择“打开”,此时会在库引用路径中添加三个库文件的引用。如下图所示:
⑵ 将我们前面实验中已经编写好的数据库访问接口IStudentDAO.java、接口实现类StudentDAOImpl、学生表模型类Student.java、工厂类DAOFactory.java和数据库连接类DatabaseBean.java复制到项目文件中(这里可以再次体会到代码重用的重要性)。包结构如下图所示:
⑶ 修改index.jsp页面的内容如下:
<%@page import="com.mis.model.Student"%>
<%@page import="java.util.*"%>
<%@page import="com.mis.util.*"%>
<%@page contentType="text/html" pageEncoding="UTF-8"%>
显示所有学生信息内容
学生学号 学生姓名 学生性别 学生年龄 学生系部
<%
List
for (Student stu : students) {
%>
<%=stu.getSno()%>
<%=stu.getSname()%>
<%=stu.getSsex()%>
<%=stu.getSage()%>
<%=stu.getSdept()%>
<%
}
%>
运行index.jsp页面,在浏览器当中将会显示出所有学生信息记录内容。我们将JSP脚本和网页元素内容融合在一起输出页面内容,这种方式对小型应用程序来说简单可行,但对大型项目的代码管理和维护工作量很大,不利于程序员和美工人员的分工。更好的方式是采用MVC思想,将项目进行分层组织管理,JSP页面负责视图(V)的显示,Servlet脚本负责控制(C)。下面我们将修改代码,还是上面显示所有学生记录的效果。这回采用MVC的思想进行编写,新建一个servlet和一个jsp页面,当项目运行时,首先调用控制层的Servlet,由Servlet负责将要显示的所有数据查询出来,以集合对象的形式放到request对象当中,然后转发forward到display.jsp页面显示出来。
⑷ 编写控制层的servlet(DisplayServlet.java)
在项目资源管理器的源包节点,右键选择菜单“新建”>“Servlet…”。如果在“新建”菜单中没有“Servlet…”选项,则选择“其他…”,然后在类别中选择“Web”,在文件类型中选择“Servlet”。
在d出New Sevlet对话框中,我们输入要新建的servlet名称为DisplayServlet,包名为com.mis.servlet,然后选择下一步,在配置Servlet部署中将“将信息添加到部署描述符(web.xml)”前的勾选上。这会将新建的servlet配置信息注册到部署描述符web.xml中,同时会在项目的WEB-INF文件夹下新建web.xml文件。
⑸ 打开web.xml文件,我们发现IDE已经帮我们写好了servlet的配置信息。我们注意到,web.xml文件选项卡上有分类显示的按钮,点击不同的分类可以看到图形化的配置信息内容。如下图所示:
切换到“页面”视图,在欢迎文件中填入我们刚刚创建的DisplayServlet名称,这样,当项目运行后,首先会自动调用DisplayServlet。
⑹ 打开刚刚创建的DisplayServlet.java文件,IDE已经帮我们写好了大部分代码结构。其中,processRequest方法代码为通过PrintWriter对象向客户端输出HTML页面内容。
protected void processRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
try {
out.println("");
out.println("");
out.println("
");out.println("
out.println("");
out.println("
");out.println("Servlet DisplayServlet at " + request.getContextPath() + "");
out.println("");
out.println("");
} finally {
out.close();
}
}
运行项目,会在客户端默认浏览器中显示“Servlet DisplayServlet at /JavaWebTest”这样一段文字。
⑺ 修改DisplayServlet.java文件中的processRequest方法,查询出所有学生记录内容以集合对象的形式存放到request的属性当中,然后转发到display.jsp页面去显示查询出的学生记录。代码如下所示:
protected void processRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
List
request.setAttribute("students", students);
request.getRequestDispatcher("display.jsp").forward(request, response);
}
⑻ 在项目资源管理器的web页节点,右键选择菜单“新建”>“JSP…”。如果在“新建”菜单中没有“JSP…”选项,则选择“其他…”,然后在类别中选择“Web”,在文件类型中选择“JSP”,新建一个名称为display.jsp的页面。修改display.jsp页面代码如下所示:
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
利用EL表达式和核心标记库显示所有学生信息内容
学生学号 学生姓名 学生性别 学生年龄 学生系部
${stu.sno}
${stu.sname}
${stu.ssex}
${stu.sage}
${stu.sdept}
运行项目,同样将会在浏览器中显示出和index.jsp页面同样效果的数据。但从代码来看,display.jsp页面显得更为优雅,所有代码都是通过标签的形式展现出来,这对美工人员来说更易于展现视图层的内容。
3、实现“插入学生记录”功能
⑴ 在项目资源管理器的web页节点,右键选择菜单“新建”>“JSP…”。如果在“新建”菜单中没有“JSP…”选项,则选择“其他…”,然后在类别中选择“Web”,在文件类型中选择“JSP”,新建一个名称为insert.jsp的页面,我们将在这个页面中创建一个表单,用来提交学生表数据。修改insert.jsp页面代码如下所示:
<%@page contentType="text/html" pageEncoding="UTF-8"%>
插入学生记录!
${insertErr}
⑵ 在insert.jsp页面代码中,我们注意到表单是以post的方式提交到InsertServlet中去处理。我们在com.mis.servlet包中新建一个InsertServlet.java文件,同样将InsertServlet配置信息注册到部署描述符文件web.xml中。修改InsertServlet.java文件中processRequest方法代码如下所示:
protected void processRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 注意下面两行代码的关键作用
request.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=UTF-8");
String sno = request.getParameter("sno");
String sname = request.getParameter("sname");
String ssex = request.getParameter("ssex");
String sage = request.getParameter("sage");
String sdept = request.getParameter("sdept");
PrintWriter out = response.getWriter();
try {
out.println("");
out.println("");
out.println("
");out.println("
out.println("");
out.println("
");out.println("插入的学生信息内容");
out.println("学生学号:" + sno);
out.println("学生姓名:" + sname);
out.println("学生性别:" + ssex);
out.println("学生年龄:" + sage);
out.println("学生系部:" + sdept);
out.println("");
out.println("");
} finally {
out.close();
}
}
运行insert.jsp页面,随意填入一些信息(带中文字符的信息),然后提交页面,InsertServlet接收到我们提交的数据后,将信息在浏览器中输出。我们发现,浏览器能够正常显示出数据内容。
⑶ 虽然InsertServlet已经能够显示出正确的内容,但一般Servlet只负责做控制层,我们希望InsertServlet来处理插入学生数据的工作,将数据显示功能转发给其它页面处理。修改InsertServlet.java文件中的processRequest方法代码如下:
protected void processRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=UTF-8");
String sno = request.getParameter("sno");
String sname = request.getParameter("sname");
String ssex = request.getParameter("ssex");
String sage = request.getParameter("sage");
String sdept = request.getParameter("sdept");
Student stu = new Student();
stu.setSno(sno);
stu.setSname(sname);
stu.setSsex(ssex);
stu.setSage(Integer.parseInt(sage));
stu.setSdept(sdept);
if (DaoFactory.getStudentDao().insertStudent(stu)) {
response.sendRedirect(request.getContextPath() + "/DisplayServlet");
} else {
request.setAttribute("insertErr", "插入信息失败,请检查原因!");
request.getRequestDispatcher("insert.jsp").forward(request, response);
}
}
此时,当我们再次运行insert.jsp页面,提交数据后,InsertServlet负责将数据插入到数据库。当插入成功时,页面重定向到DisplayServlet显示所有学生数据信息;插入失败时,将错误提示信息封装到request属性当中,转发到原来的insert.jsp页面,在insert.jsp页面中显示出错信息。
出错信息由insert.jsp页面中这段代码负责显示:
${insertErr}
。4、利用所学知识尝试编写删除学生数据、修改学生数据和查询指定学号学生数据的功能。
删除学生数据
request.setCharacterEncoding("gbk");
Class.forName("com.mysql.jdbc.Driver");
Connection con = DriverManager.getConnection(
"jdbc:mysql://localhost:3306/student?useUnicode=true&characterEncoding=utf-8", "root", "root");
Statement stmt = con.createStatement();
String id = request.getParameter("id");
int i = stmt.executeUpdate("delete from student where id=" + id);
if (i == 1) {
} else {
stmt.close();
con.close();
修改学生数据
request.setCharacterEncoding("utf-8");
int id = Integer.parseInt(request.getParameter("id"));
String name = request.getParameter("name");
String sex = request.getParameter("sex");
String birthday = request.getParameter("birthday");
String address = request.getParameter("address");
Class.forName("com.mysql.jdbc.Driver");
Connection con = DriverManager.getConnection(
"jdbc:mysql://localhost:3306/student?useUnicode=true&characterEncoding=utf-8", "root", "root");
Statement stmt = con.createStatement();
String sql = "update student set id = '" + id + "',name='" + name + "',
"'where id=" + id;
int i = stmt.executeUpdate(sql);
if (i == 1) {
} else {
}
stmt.close();
con.close();
查询指定学号学生数据
request.setCharacterEncoding("gbk");
Class.forName("com.mysql.jdbc.Driver");
Connection con = DriverManager.getConnection(
"jdbc:mysql://localhost:3306/student?useUnicode=true&characterEncoding=utf-8", "root", "root");
Statement stmt = con.createStatement();
String id = request.getParameter("id");
int i = stmt.executeUpdate("delete from student where id=" + id);
if (i == 1) {
} else {
}
stmt.close();
con.close();
5、实验总结
请书写你对本次实验有哪些实质性的收获和体会,以及对本次实验有何良好的建议?
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)