Java Web MVC 一个实例的手动实现
平台:
tomcat7.0 Servlet3.0 Windows命令行编译
实现的功能:
在网页上可以进行对Product类的三个属性的输入,点击保存之后跳转到另一个显示输入内容的界面
文件结构:
- SpringDemo02
- index.html
- WEB-INF
- web.xml
- classes
- jsp
- lib
说明:
- index.html是欢迎界面,当没有指定到具体的servlet(为 /SpringDemo02/)时显示
- WEB-INF中的文件将被确保不会被URL直接访问到
- web.xml进行servlet和欢迎文件的配置
- classes放置Java文件(Controller和Model)
- jsp防止不想被URL直接访问的页面文件(View)
- lib放置引用的文件
index.html
随便写一个欢迎内容
web.xml
用于配置servlet/Listener/filter/welcome file等。这里只配置servlet和welcome file
<?xml version="1.0" encoding="ISO-8859-1"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
version="3.0">
<servlet>
<servlet-name>ControllerServlet</servlet-name>
<servlet-class>ControllerServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ControllerServlet</servlet-name>
<url-pattern>/product_input</url-pattern>
<url-pattern>/product_save</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
</web-app>
前面的web-app的配置基本是固定的,和web的版本有关
配置ControllerServlet的<servlet-class>将到WEB-INF文件夹下的classes文件夹找对应的类文件
将这个servlet映射到/product_input和/product_save的URL模式
lib
放置会使用到的javax.servlet-api-3.0.1.jar
jsp
product_input.jsp:有表单和一个按钮,点击按钮后将向product_save方法通过POST方法发送表单中的内容
效果:
代码如下:
<!DOCTYPE HTML>
<html>
<head>
<title>input product</title>
</head>
<body>
<form id="input_form" action="product_save" method="post">
<label>
<span>Name</span>
<input id="name" type="text" name="name"/>
</label>
<label>
<span>Discription</span>
<input id="discription" type="text" name="discription"/>
</label>
<label>
<span>Price</span>
<input id="price" type="number" name="price"/>
</label>
<label>
<span> : </span>
<input type="submit"/>
</label>
</form>
</body>
</html>
form的action属性表示有提交按钮的时候向product_save方法提交数据,用post方法
product_save.jsp:显示传入的数据的内容
效果如下:
代码如下:
<!DOCTYPE HTML>
<html>
<head>
<title>save product</title>
</head>
<body>
<p>
Product Name: ${product.name}<br/>
Discription: ${product.discription}<br/>
Price: ${product.price}
</p>
</body>
</html>
在控制器中将会向响应数据写入product对象,并将该对象命名为"product",所以在这个jsp文件中可以通过${product.XXX}访问到对应的属性数据
classes
有五个类:
- ControllerServlet:主要的控制逻辑的servlet
- Product:实体类
- ProductForm:提交的表单数据对应的类
- SaveProductAction:数据库操作(但实际上方法是空的)
- DefaultServlet:用以演示默认servlet的servlet类
Product:
代码如下:
public class Product
{
private String name ;
private String discription ;
private float price;
public String getName()
{
return this.name;
}
public void setName(String name)
{
this.name = name;
}
public String getDiscription()
{
return this.discription;
}
public void setDiscription(String discription)
{
this.discription = discription;
}
public float getPrice()
{
return this.price;
}
public void setPrice(float price)
{
this.price = price;
}
}
ProductForm:
代码如下
public class ProductForm
{
private String name ;
private String discription ;
private float price;
public String getName()
{
return this.name;
}
public void setName(String name)
{
this.name = name;
}
public String getDiscription()
{
return this.discription;
}
public void setDiscription(String discription)
{
this.discription = discription;
}
public float getPrice()
{
return this.price;
}
public void setPrice(float price)
{
this.price = price;
}
}
虽然在这个简单的demo中Product类和ProductForm类是一样的,看起来没有必要分开实现,但是实际上提交的数据和表示数据库的实体类可能有不一致等情况,而且为了降低耦合,还是将这两种分为两个类
DefaultServlet:
import java.io.*;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class DefaultServlet extends HttpServlet
{
public void doGet(HttpServletRequest req, HttpServletResponse resp)
throws IOException, ServletException
{
PrintWriter out = resp.getWriter();
out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">");
out.println("<HTML>");
out.println(" <HEAD><TITLE>A Servlet</TITLE></HEAD>");
out.println(" <BODY>");
out.print(" This is ");
out.print(this.getClass());
out.println(", using the GET method");
out.println(" </BODY>");
out.println("</HTML>");
out.flush();
out.close();
}
public void doPost(HttpServletRequest req, HttpServletResponse resp)
throws IOException, ServletException
{
PrintWriter out = resp.getWriter();
out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">");
out.println("<HTML>");
out.println(" <HEAD><TITLE>A Servlet</TITLE></HEAD>");
out.println(" <BODY>");
out.print(" This is ");
out.print(this.getClass());
out.println(", using the POST method");
out.println(" </BODY>");
out.println("</HTML>");
out.flush();
out.close();
}
}
这个类实现了HttpServlet接口,重写了doGet和doPost方法,随便输出了一些和当前对象有关的信息
ServletResponse中内置了一个PrintWriter,客户端接收到数据后会写为页面
ControllerServlet:
import java.io.IOException;
import java.io.*;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
// 通过注解注册servlet而不用在xml中注册
@WebServlet(name = "ControllerServlet", urlPatterns = {"/product_input","/product_save"})
public class ControllerServlet extends HttpServlet
{
@override
public void doGet(HttpServletRequest req, HttpServletResponse resp)
throws IOException, ServletException
{
process(req,resp);
}
@override
public void doPost(HttpServletRequest req, HttpServletResponse resp)
throws IOException, ServletException
{
process(req,resp);
}
//
private void process(HttpServletRequest req, HttpServletResponse resp)
throws IOException, ServletException
{
// 解析URL
String uri = req.getRequestURI();
int lastIndex = uri.lastIndexOf("/");
String action = uri.substring(lastIndex+1);
// 根据URL解析出来的action进行相应的操作
if(action.equals("product_input"))
{
}
else if(action.equals("product_save"))
{
// 从HttpServletRequest获取数据到表单
ProductForm pf = new ProductForm();
pf.setName(req.getParameter("name"));
pf.setDiscription(req.getParameter("discription"));
pf.setPrice(Float.valueOf(req.getParameter("price")));
// 根据表单设置实体类
Product p = new Product();
p.setName(pf.getName());
p.setDiscription(pf.getDiscription());
p.setPrice(pf.getPrice());
// 写回数据库
SaveProductAction spa = new SaveProductAction();
spa.save(p);
// 将获取到的实体对象写回到响应以便显示
req.setAttribute("product",p);
}
// 调用View
String requestDispatcher = null;
if(action.equals("product_input"))
{
requestDispatcher = "WEB-INF/jsp/product_input.jsp";
}
else if(action.equals("product_save"))
{
requestDispatcher = "WEB-INF/jsp/product_save.jsp";
}
if(requestDispatcher!=null)
{
RequestDispatcher rd = req.getRequestDispatcher(requestDispatcher);
rd.forward(req,resp);
}
}// process
}// class
这个类能获得的只有HttpServletRequest和HttpServletResponse,要从里面获取URL并解析
无论获取到的是POST方法还是GET方法都执行process方法
根据解析出来的action进行相应的操作之后需要跳转到相应的View中,即jsp文件。需要从HttpServletRequest中获取RequestDispatcher对象,以此进行跳转
SaveProductAction:
这是模拟数据库操作的
public class SaveProductAction
{
public void save(Product p)
{
// save to database
}
}
编译
在命令行编译的时候需要加上使用到的jar文件,方式是javac -cp jar文件路径 源文件.java,-cp也可以替换为-classpath
需要注意的是当使用-cp的时候会取消默认使用当前文件夹中的class文件,所以要在 .jar文件路径后面加上 ";."表示还有当前路径下的class文件
部署
编译之后,将SpringDemo02文件夹拷贝到Tomcat中的Webapps文件夹下,运行tomcat文件夹中bin文件夹下的startup.bat运行tomcat,启动时tomcat将自动部署webapps文件夹中的应用程序
tomcat的安装:下载tomcat压缩包解压,并将这个文件夹配置到环境变量的CATALINE_HOME下,将bin文件夹配置到环境变量的PATH中
运行
tomcat会默认使用本地的8080端口
localhost:8080/SpringDemo02/product_input
点击提交之后:
Java Web MVC 一个实例的手动实现的更多相关文章
- Spring MVC框架一个实例的手动实现
文件结构: SpringMVC05 // 应用程序名 ----index.html // 欢迎文件,主目录下的文件可以被URL直接访问到 ----WEB-INF // 这个目录下的文件将被保护起来不能 ...
- Java web MVC开发模式入门感悟
当我进行第一个完整的java web项目的开发时,对以前所学的Java web知识体系有了一个清晰的进阶认识.我觉得非常有必要对此进行必要的总结. MVC,意指model(数据持久层)+viewer( ...
- java web 开发入门实例
学习是个技巧活,关键是要找到重点的地方,新手在这方面的坑尤其多.看别人的教程一步一步的跟着做,隔几步就遇到一个新知识点,忍不住就百度往深处了解,一晃半天就过去了. 有的知识点要深入学习的,有的是了解下 ...
- fast-framework – 基于 JDK 8 实现的 Java Web MVC 框架
摘要: 原创出处:www.bysocket.com 泥瓦匠BYSocket 希望转载,保留摘要,谢谢! fast-framework 轻量级 Java Web 框架 – https://github. ...
- 带领技术小白入门——基于java的微信公众号开发(包括服务器配置、java web项目搭建、tomcat手动发布web项目、微信开发所需的url和token验证)
微信公众号对于每个人来说都不陌生,但是许多人都不清楚是怎么开发的.身为技术小白的我,在闲暇之余研究了一下基于java的微信公众号开发.下面就是我的实现步骤,写的略显粗糙,希望大家多多提议! 一.申请服 ...
- Java Web MVC实例
开发环境 Eclipse Java EE IDE for Web Developers. Version: Luna Service Release 2 (4.4.2) tomcat:7.0 数据库: ...
- java web mvc思想介绍
1.首先简介一下什么是MVC思想. 在百度百科里面对MVC的说明,MVC全名是Model View Controller.是模型(model)-视图(view)-控制器(controller)的缩写. ...
- 学习之响应式Web设计---一个实例
周末闲来无事,做了一个响应式设计的例子.当然,由此并不能窥见响应式设计真谛之一斑.但,对于初次接触响应设计,对于响应式设计的概念依旧模糊不清的同学来说,或许是个启蒙! 闲语暂且不表,进入正题,这里没有 ...
- java web开发基础实例(javabean+jsp+servlet+jdbc)
JavaBean:用于传递数据,拥有与数据相关的逻辑处理 JSP:从Model接收数据并生成HTML Servlet:接收HTTP请求并控制Model和View jdbc:用于配置环境 一.[建立数据 ...
随机推荐
- 乌班图 之 apt命令 及 VMware共享文件夹
apt是Advanced Packaging Tool ,是Ubuntu下的一个安装包管理工具 大部分软件的安装.更新.卸载 都是利用apt命令来实现 直接在终端输入apt即可查阅命令的帮助信息 常用 ...
- Intellij IDEA安装与使用,完整详细。
https://blog.csdn.net/qq_41879385/article/details/81952656 https://www.jetbrains.com/idea/download/# ...
- 74HC165应用
管脚定义与内部逻辑图 注1:其中控制管脚有3个:SH/LD-QH-CLK,CLK INH硬件接VSS,SER和QH'悬空 原理:先拉低SH/LD,A-H置入芯片内部寄存器中,然后拉高SH/LD,锁住A ...
- 由Request Method:OPTIONS初窥CORS(转)
刚接触前端的时候,以为HTTP的Request Method只有GET与POST两种,后来才了解到,原来还有HEAD.PUT.DELETE.OPTIONS…… 目前的工作中,HEAD.PUT.DELE ...
- ajax请求携带 cookie
之前都有这样一个理解:ajax请求时是不会自动带上cookie的,要是想让他带上的话,必须哟啊设置withCredential为true.这个说法会让人产生完全扭曲的误解,我就是其中之一.完整的无歧义 ...
- docker-ce-17.03.2 离线安装RPM包
[root@docker05 docker]# ll total 20796 -rw-r--r-- 1 root root 75032 Mar 26 23:52 audit-libs-pytho ...
- 洛谷 P1070 道路游戏
设为第i秒获得的最大值 表示从当前世界是j,从pos走k步到当前点i的最大价值 注意这里的sum可以利用前面的值逐步累加. 我开始做的时候没有想到这一点单独求,然后就超时了. 同时要注意循环的循序问题 ...
- Java基础学习总结(46)——JAVA注解快速入门
各位开发童鞋,注解这个东西我们肯定每天都能看见,也许有时候看的太多了到是会忽略注解这东西具体是如何工作的.今天在这里用最短的篇幅快速讲解下注解的原理,对这块记的不太清楚的同学也可以再次看看,下次有人详 ...
- ActiveMQ安装部署(Windows)
JMS(Java Messaging Service)是Java平台上有关面向消息中间件的技术规范,它便于消息系统中的Java应用程序进行消息交换,并且通过提供标准的产生.发送.接收消息的接口简化企业 ...
- Tsinsen A1303. tree(伍一鸣) LCT
LCT的各种操作... . cut link add mul size rev query 写的效率不够高... BZOJ上似乎TLE. ... A1303. tree(伍一鸣) 时间限制:2.5s ...