Servlet开发-----基础及MVC设计模式
一、Servlet介绍
Servlet简单的说就是一个Java程序,目的和Javabean差不多,为了使得JSP页面中代码简洁、清晰;
JavaBean不需要配置,只需要放在WEB-INF/classes中即可;
Servlet也是放在 WEB-INF/classes/中,并在web.xml中配置如下形式:
- <servlet>
- <servlet-name></servlet-name>
- <servlet-class></servlet-class>
- </servlet>
- <servlet-mapping>
- <servlet-name></servlet-name>
- <url-pattern></url-pattern>
- </servlet-mapping>
如果需要设置配置信息,则需要形式如下:
- <servlet>
- <servlet-name></servlet-name>
- <servlet-class></servlet-class>
- <init-param>
- <param-name></param-name>
- <param-value></param-value>
- </init-param>
- </servlet>
- <servlet-mapping>
- <servlet-name></servlet-name>
- <url-pattern></url-pattern>
- </servlet-mapping>
注意:在url-pattern中,主目录为:"/",而不是"\"!
Servlet可以处理客户端传来的请求,即request,并且可以返回给客户端回应,即response,这个操作通过
(1)public void service(ServletRequest req,ServletResponse resp)throws ServletExeption,IOException{}
(2)public void doGet(HttpServletRequest req,HttpServletResponse resp)throws ServletExeption,IOException{}
(3)public void doPost(HttpServletRequest req,HttpServletResponse resp)throws ServletExeption,IOException{}
完成;
这里需要注意的是service的参数只是ServletRequest,而其他两个函数的参数是HttpServletRequest;
一般如果我们要自定义Servlet,则需要继承HttpServlet类,并覆盖相应的方法即可;
二、Servlet的结构
Servlet生命周期为:加载-->初始化--->服务--->销毁--->卸载;
加载:web容器加载Servlet,即创建一个Servlet实例;
初始化:调用servlet的init方法,为了完成一些预备动作;
当请求到来时,
服务:创建一个request、response对象,并创建一个线程,调用类service方法;
销毁:调用destroy()方法;当一个Servlet对象长时间不使用或web容器(tomcat)关闭时调用;
卸载:即退出;
继承HttpServlet后,可以覆写以下方法:
1.public void init(ServletConfig config)throws ServletException{} //初始化Servlet,(1)当需要使用Servlet时调用;(2)如果在web.xml中配置,则可以web容器启动时自动加载;配置如下:
- <serlvet>
- <serlvet-name></servlet-name>
- <servlet-class></servlet-class>
- <load-on-startup>1</load-on-startup>
- </servlet>
2.public void init(ServletConfig config)throws ServletExeption{} //初始化Servlet,可以得到配置信息
3.public void doGet(HttpServletRequest req,HttpServletResponse resp)throws ServletExeption,IOException{} 当get方式传递,则调用此方法
4.public void doPost(HttpServletRequest req,HttpServletResponse resp)throws ServletExeption,IOException{}当post方法传递,则调用此方法
5.public void service(HttpServletRequest req,HttpServletResponse resp)throws ServletExeption,IOException{}
6.public void destroy(){} //销毁时调用
注意:
1. 当1,2同时出现时,2有较高优先级;
2. 当3或4和5同时出现时,5具有较高优先级;
3 .PrintWriter writer = resp.getWriter();可以获得输出流;
注意:writer输出时需要输出HTML结构;
三、Servlet常见问题
1.在init方法中,通过config.getInitParameter()方法取得配置信息;
2.req.getSession():取得Session对象;
3.super.getServletContext();取得application对象;因为GenericServlet中有getServletContext方法;
4.resp.getWriter()返回一个PrintWriter用以输出文本数据、resp.getOutputStream()输出二进制数据,并且两者不能同时调用;
5.在init(ServletConfig config)方法中需要调用super.init(config);
6. 在service()方法中getServletConfig()返回 ServletConfig;
四、Servlet跳转
1.客户端跳转:resp.sendRedirect("1.jsp") ; //类似于内置对象中的跳转;
2.服务器跳转:req.getRequestDispatcher("/hello.jsp").forward(req,resp);能够跳转到hello.jsp中;
注意:客户端跳转和服务器端跳转的区别;
注意:这里的getRequestDispatcher中的网页一定要加“ / ”
五、MVC设计模式
在之前我们讲过JSP+JAVABEAN的DAO开发模式,这个适用于小型开发;
MVC最早是由SmallTalk提出的;
Controller: Servlet 负责接收客户请求并转发给Model;
Model :JavaBean 负责真正处理业务逻辑;
View:JSP 负责输出结果;
EJB(Enterprise JavaBean);
MVC(Model View Control)是一种以Servlet为核心的开发模式,流程如下:
步骤如下:
1.客户端发送请求给Servlet;
2.Servlet接收请求后处理,并可以调用JavaBean(即进行数据库操作,并返回结果);
3.Servlet返回结果给JSP显示;(通过设置request属性后调用RequestDispatcher方法跳转,并在JSP页面中接收request属性);
因此JSP只是用于显示,而JavaBean只和Servlet通信;
注意:在MVC中,使用requestDispatcher的机会很多,我们都是通过这个类进行服务器跳转的;
六、MVC实例
功能:登录功能
1.JavaBean部分
User.java
- package org.vo;
- public class User{
- private String id;
- private String name;
- private String password;
- public String getId(){
- return id;
- }
- public void setId(String id){
- this.id = id;
- }
- public String getName(){
- return name;
- }
- public void setName(String name){
- this.name = name;
- }
- public void setPassword(String password){
- this.password = password;
- }
- public String getPassword(){
- return password;
- }
- }
IUserDAO.java
- package org.dao;
- import org.vo.*;
- public interface IUserDAO{
- public boolean findLogin(User user)throws Exception;
- }
UserDAOImpl.java
- package org.dao.impl;
- import java.sql.*;
- import org.vo.*;
- import org.dao.*;
- public class UserDAOImpl implements IUserDAO{
- private Connection con;
- public UserDAOImpl(Connection con){
- this.con = con;
- }
- public boolean findLogin(User user)throws Exception{
- boolean flag = false;
- String sql = "SELECT name FROM user WHERE id=? AND password=?";
- PreparedStatement stat = con.prepareStatement(sql);
- stat.setString(1,user.getId());
- stat.setString(2,user.getPassword());
- ResultSet rs = stat.executeQuery();
- if(rs.next()){
- user.setName(rs.getString(1));
- flag = true;
- }
- return flag;
- }
- }
UserDAOProxy.java
- package org.dao.proxy;
- import org.dao.*;
- import org.vo.*;
- import org.dao.impl.*;
- import org.dbc.*;
- public class UserDAOProxy implements IUserDAO{
- private DatabaseConnection dbc;
- private IUserDAO idao;
- public UserDAOProxy(){
- dbc = new DatabaseConnection();
- idao = new UserDAOImpl(dbc.getConnection());
- }
- public boolean findLogin(User user)throws Exception{
- if(user==null){
- return false;
- }
- boolean flag = idao.findLogin(user);
- dbc.close();
- return flag;
- }
- }
DatabaseConnection.java
- package org.dbc;
- import java.sql.*;
- public class DatabaseConnection{
- public static final String DRIVER = "com.mysql.jdbc.Driver";
- public static final String URL = "jdbc:mysql://localhost:3306/mldn";
- public static final String USER = "root";
- public static final String PASS = "123456";
- private Connection con;
- public DatabaseConnection(){
- try{
- Class.forName(DRIVER);
- con = DriverManager.getConnection(URL,USER,PASS);
- }
- catch(Exception e){}
- }
- public Connection getConnection(){
- return con;
- }
- public void close(){
- try{
- if(con!=null){
- con.close();
- }
- }
- catch(Exception e){}
- }
- }
DAOFactory.java
- package org.factory;
- import org.dao.*;
- import org.dao.proxy.*;
- public class DAOFactory{
- public static IUserDAO getInstance(){
- return new UserDAOProxy();
- }
- }
以上代码是JavaBean部分;MVC的特点是用Servlet调用JavaBean,而不是JSP调用JavaBean;
2.Servlet部分
以下是Servlet部分:Servlet是接收客户端请求,并调用JavaBean进行数据库操作;并把结果通过设置request属性传给JSP进行显示;(贯穿核心)
LoginServlet.java
- package org.servlet;
- import java.util.*;
- import javax.servlet.*;
- import javax.servlet.http.*;
- import org.factory.*;
- import org.vo.*;
- import java.io.*;
- public class LoginServlet extends HttpServlet{
- public void doGet(HttpServletRequest req,HttpServletResponse resp)throws ServletException,IOException{
- String path = "login.jsp";
- String id = req.getParameter("id");
- String pass = req.getParameter("pass");
- List<String> info = new ArrayList<String>();
- if(id==null||"".equals(id)){
- info.add("id不能为空");
- }
- if(pass==null||"".equals(pass)){
- info.add("密码不能为空");
- }
- if(info.size()==0){
- User user = new User();
- user.setId(id);
- user.setPassword(pass);
- try{
- if(DAOFactory.getInstance().findLogin(user)==true){
- info.add("欢迎光临");
- }
- else{
- info.add("错误的用户名和密码");
- }
- }
- catch(Exception e){}
- }
- req.setAttribute("info",info);
- req.getRequestDispatcher(path).forward(req,resp);
- }
- public void doPost(HttpServletRequest req,HttpServletResponse resp)throws ServletException,IOException{
- this.doGet(req,resp);
- }
- }
Login.jsp
- <%@page contentType="text/html" pageEncoding="GBK" import="java.util.*"%>
- <html>
- <head>
- <title>A</title>
- </head>
- <script language="Javascript">
- function validate(f){
- if(!(/^\w{5,15}$/.test(f.id.value))){
- alert("id长度不对");
- f.id.focus();
- return false;
- }
- if(!(/^\w{5,15}$/.test(f.pass.value))){
- alert("密码长度不对");
- f.pass.focus();
- return false;
- }
- return true;
- }
- </script>
- <body>
- <h2>用户登录程序</h2>
- <%
- request.setCharacterEncoding("GBK");
- List<String> info = (List<String>)request.getAttribute("info");
- if(info!=null){
- Iterator<String>iter = info.iterator();
- while(iter.hasNext()){
- %>
- <h4><%=iter.next()%></h4>
- <%
- }
- }
- %>
- <form action="LoginServlet" method="post" onSubmit="return validate(this)">
- 用户ID:<input type="text" name="id"/><br />
- 密码:<input type="password" name="pass"/><br />
- <input type="submit" value="提交"/>
- </form>
- </body>
- </html>
数据库脚本:
- CREATE TABLE user(
- id varchar(30) PRIMARY KEY,
- name varchar(30) ,
- password varchar(30)
- );
- INSERT INTO user VALUES('XIAZDONG','xiazdong','12345');
因此最后再强调一下Mode1和Mode2的区别:
Mode1是通过JSP调用JavaBean;Mode2是通过Servlet调用JavaBean;
Mode1在JSP中仍然有处理的部分,而Mode2中JSP只负责显示;
补充:Servlet调用过程顺序图
ServletContext介绍
- <context-param>
- <param-name></param-name>
- <param-value></param-value>
- </context-param>
配置;
- context.getRequestDispatcher("/1.html").forward(request,response);
- InputStream in = context.getResourceAsStream("*.properties");
- Properties props = new Properties();
- props.load(in);
补充:web开发中地址书写问题
地址书写时常用到“/”开头,而“/”有两个宗旨:
1.面向浏览器,则"/"表示http://localhost:8080/
2.面向服务器,则"/"表示当前web应用;
面向浏览器的意思是:是否会让浏览器地址栏改变;其余的都是面向服务器;
2.response.sendRedirect("地址B");
补充:在提供客户发出请求之前的过程
1.从web.xml中读出Servlet初始化参数和上下文初始化参数;
2.创建一个ServletConfig对象和ServletContext对象;
3.将Servlet初始化参数的引用赋给ServletConfig对象,把上下文初始化参数赋值给ServletContext对象;
4.创建ServletContextListener监听器实例;
5.调用contextInitialized()方法;
6.创建这个Servlet实例;
7.调用init方法;
注意:
(1)在Servlet构造函数中还没有ServletConfig对象,虽然能够调用getServletConfig()方法;
(2)ServletConfig对象在Servlet实例创建之前就已经创建;
(3)web.xml的初始化参数只会读一次,如果需要更新,则需要重新部署;
上下文初始化参数:整个web应用都能够访问的初始化参数;
<context-param>
<param-name>name</param-name>
<param-value>value</param-value>
</context-param>
getServletContext().getInitParameter("name")即可;
每个Servlet有一个ServletConfig,每个web应用有一个ServletContext;
如果web应用时分布式的,则每个JVM都有一个ServletContext;
注意:getAttribute()返回的是Object;
Person p = getServletContext().getAttribute("person");是错误的!!!!!!!!!!!!!!!!!!!!!
Person p = (Person)getServletContext().getAttribute("person");是正确的;
Servlet开发-----基础及MVC设计模式的更多相关文章
- Java Servlet开发的轻量级MVC框架最佳实践
在Servlet开发的工程实践中,为了减少过多的业务Servlet编写,会采用构建公共Servlet的方式,通过反射来搭建轻量级的MVC框架,从而加快应用开发. 关于Servlet开发的基础知识,请看 ...
- iOS开发--Swift 基于MVC设计模式的简单的tableViewDemo
如果说MVC是最好的设计模式, 可能很多人并不赞同, 但是如果说MVC是最主流, 应用面最广的设计模式, 我想这是毫无争议的. 不说废话, 直接演示在Swift中如何使用MVC新建工程(我并没有新建文 ...
- 第十七章:Python の Web开发基础(四) MVC与Django
本課主題 MVC 介绍 Django 介紹 MVC 介绍 controllers 处理用户请求 views 放置HTML模版 models 操作数据库 MVC框架就是目录的归类 MVC 是一种软件开发 ...
- iOS开发中的MVC设计模式
我们今天谈谈cocoa程序设计中的 模型-视图-控制器(MVC)范型.我们将从两大方面来讨论MVC: 什么是MVC? M.V.C之间的交流方式是什么样子的? 理解了MVC的概念,对cocoa程序开发是 ...
- 自学MVC开发基础
由于现在面试需求,我必须有点了解MVC开发基础,MVC是一个开发框架或者是一个开发模式,MVC让软件开发的过程大致切割成三个单元,分别是:Model(模型).View(试图).Controller(控 ...
- 【原创翻译】认识MVC设计模式:web应用开发的基础(实际编码篇)
原文地址:http://www.larryullman.com/2009/10/15/understanding-mvc-part-3/ 全系列INDEX [原创翻译]认识MVC设计模式:web应用开 ...
- AngularJS_01之基础概述、设计原则及MVC设计模式
1.AngularJS: 开源的JS框架,用来开发单一页面应用,以及数据操作频繁的场景:2.设计原则: ①YAGNI原则:You Aren't Gonna Need It! 不要写不需要的代码! ②K ...
- Java Web开发中MVC设计模式简介
一.有关Java Web与MVC设计模式 学习过基本Java Web开发的人都已经了解了如何编写基本的Servlet,如何编写jsp及如何更新浏览器中显示的内容.但是我们之前自己编写的应用一般存在无条 ...
- JSP/Servlet开发——第七章 Servel基础
1.Servlet简介: ●Servlet是一个符合特定规范的 JAVA 程序 , 是一个基于JAVA技术的Web组件. ●Servlet允许在服务器端,由Servlet容器所管理,用于处理客户端请求 ...
随机推荐
- Asp.net视图状态的作用
视图状态(view state)是在单个页面中保存信息的第一选择,ASP.NET Web控件也使用试图状态在回发间保存属性值.通过页面内建的 ViewState 属性,你可以把自己的数据放入到视图状态 ...
- ant design pro(一)安装、目录结构、项目加载启动【原始、以及idea开发】
一.概述 1.1.脚手架概念 编程领域中的“脚手架(Scaffolding)”指的是能够快速搭建项目“骨架”的一类工具.例如大多数的React项目都有src,public,webpack配置文件等等, ...
- 错误代码: 1066 Not unique table/alias: 'c'
1.错误描写叙述 1 queries executed, 0 success, 1 errors, 0 warnings 查询:SELECT (SELECT CONCAT( s.name, '/', ...
- 流媒体协议RTMP,RTSP与HLS有什么不同
转载自:http://www.cuplayer.com/player/PlayerCode/Wowza/2015/0204/1774.html HLS (HTTP Live Streaming) Ap ...
- thinkphp 重写
我们知道,在thinkphp的案例中有一个.htaccess文件,里面配置了URL的一些重写规则,如: <IfModule mod_rewrite.c> RewriteEngine on ...
- spring的注解形式:@Repository、@Service、@Controller,
Spring的注解形式:@Repository.@Service.@Controller,它们分别对应存储层Bean,业务层Bean,和展示层Bean. @Repository.@Service.@C ...
- Docker的安装使用-第1章
Docker的安装 1.1 环境说明 操作系统: Red Hat Enterprise Linux Server release 7.1 软件环境: 系统已经配置了yum安装源 软件版本: docke ...
- Python translate()方法
描述 Python translate() 方法根据 maketrans() 方法给出的字符映射转换表转换字符串中的字符. 语法 translate() 方法语法: Python3中: S.trans ...
- Chrome 浏览器端口的坑:ERR_UNSAFE_PORT
nodejs 启动了一个6000端口的服务 本来是打算测试用的,结果一直报以下错误 但我使用 curl 来请求该接口地址是正常的.这就很纳闷了. 经过一番折腾无果之后,百度才知道.这个6000端口是非 ...
- 阿里云maven 库
阿里云maven 库 , 好用,速度快 maven setting.xml https://github.com/ae6623/Zebra/blob/master/maven-repo-setting ...