MVC架构(一)构建JSP+Servlet+JDBC结构的web项目

项目介绍

一个简单的javaweb项目,可以总结为通过MVC架构实现用户与数据交互的效果。而javaweb项目的MVC架构已经非常成熟,从最初的servlet+jsp+jdbc到SSH框架再到现在非常流行的SSM框架。本文利用JSP作为V(view)层,servlet作为C(controller)层,JDBC作为M(model)层,来搭建并体验一下原始javaweb项目。
搭建项目架构

1、在http://blog.csdn.net/lk7688535/article/details/77480148讲过的使用maven构建web项目的基础上,开始我们的项目开发。

2、引入servlet的jar包,在http://maven.aliyun.com中搜索servlet和mysql-jdbc,将dependency复制到pom.xml。

< dependency>
 < groupId>javax.servlet</groupId>
 <artifactId>javax.servlet-api</artifactId>
  <version>4.0.0</version>
 </dependency>

 <dependency>
  <groupId>mysql</groupId>
  <artifactId>mysql-connector-java</artifactId>
  <version>5.1.10</version>
</dependency>

3、在main/java下 
创建com.leetech.action、com.leetech.dao、com.leetech.service、com.leetech.bean、com.leetech.util五个包。action包存放用于处理用户请求的servlet类,service包存放业务处理逻辑,bean包存放java bean,dao包存放jdbc与数据库的交互,util存放工具类文件。
从前端到后台

实现一个登陆请求

4 、写一个jsp页面,里面放个form表单,用于处理用户请求到后台:
<form class="form-signin" role="form" action="userLoginAction" method="post">
        <input type="text" name="username" class="form-control" placeholder="用户名" required autofocus />
        <input type="password"  name="password" class="form-control" placeholder="密码" required />
        <button class="btn btn-lg btn-warning btn-block" type="submit">登录</button>
        <label class="checkbox">
            <input type="checkbox" value="remember-me"> 记住我
        </label>
    </form>

5、写一个servlet类处理这个登录请求,这个servlet类要继承抽象类HttpServlet。
在该类上按两次ctrl+o可以查看父类(HttpServlet)的属性和方法。

通过快捷键alt+shift+s,并选择Override/Implement Methods即可选择父类的方法进行重写或实现。

一般可以重写的有doGet、doPost、service、init和destroy方法。

service方法是接口中的方法,servlet容器把所有请求发送到该方法,该方法默认行为是转发http请求到doXXX方法中,如果你重载了该方法,默认操作被覆盖,不再进行转发操作!

现在不论你的客户端是用pos还是get来请求此servlet 都会执行service方法也只能执行service方法,不会去执行doPost或是doGet方法。

get不能用于汉字的传参。

    private static final long serialVersionUID = 1L;
    public UserLoginAction(){
        System.out.println("LoginServlet构造函数");
    }
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
        System.out.println("servlet的doGet");
    }
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
        System.out.println("servlet的doPost");
    }
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
        System.out.println("执行servlet的service");
        req.setCharacterEncoding("utf-8"); 
        String username = req.getParameter("username");
        String password = req.getParameter("password");
        System.out.println("登录的用户名和密码分别为"+username+password);
        //req.getRequestDispatcher("/subinfo.jsp").forward(req, resp);
         resp.sendRedirect("/MavenWeb/subinfo.jsp");
    }
    @Override
    public void init() throws ServletException {
        System.out.println("servlet初始化");
    }
    @Override
    public void destroy() {
        System.out.println("servlet销毁了");
    }

从处理请求最后的代码:

    //req.getRequestDispatcher("/subinfo.jsp").forward(req, resp);
     resp.sendRedirect("/MavenWeb/subinfo.jsp");

可以看到,处理完请求后的跳转方式有两种:redirect(重定向)和forward(转发)。

redirect:服务器收到request后向客户浏览器发送一个状态头请求,相当于两次请求,可以将页面跳转到任何页面,不一定局限于本web应用中。

forward:只能跳转到本web应用中的页面上,跳转后浏览器地址栏不会变化,相当于请求转发,即前后页面共享一个request,是在服务器端运行。

6、注册该servlet到web.xml。

<servlet>
    <servlet-name>loginServlet</servlet-name>
    <servlet-class>com.leetech.action.UserLoginAction</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>loginServlet</servlet-name>
    <url-pattern>/userLoginAction</url-pattern>
</servlet-mapping>

servlet3.0提供了注解的方式,可以直接在servlet类上写:

@WebServlet("/userSubinfoAction")
public class UserLoginAction extends HttpServlet{...}
//或者:
@WebServlet(name="loginAction",urlPatterns="/userSubinfoAction")

7、servlet3.0上传文件
早期的servlet不支持文件上传,需要commons-fileUpload和commons-io的jar包,servlet3.0版本集成了文件上传功能,步骤如下: 
(1)jsp中的form标签加入

enctype=”multipart/form-data”
(2)表单加入上传文件元素:

<input name="photoFile" type="file" id="inputfile" class="col-sm-4">

(3)注册servlet类时的配置: 
通过注解注册则在类上加入@MultipartConfig,通过xml注册则需在servlet标签里加入

 <multipart-config></multipart-config>  

两种配置都可设定文件的默认上传路径、单个文件最大值,所有文件最大值等属性。 
(4)servlet类接收上传的文件并存储:

//只需两行代码完成上传文件的存储:
Part part = req.getPart("photoFile");
part.write( "F:/picture.png");
//还可以通过如下获得具体的文件信息
part.getSize();//文件大小
part.getContentType();//文件类型
part.getHeader("content-disposition");//form-data; name="photoFile"; filename="mavenWeb项目结构图.png"

从后台到数据库

实现用户注册

8、前端填写用户信息:
    <form class="form-horizontal" enctype="multipart/form-data"  role="form" action="userSubinfoAction" method="post">
     <div class="form-group">
        <label for="inputName" class="col-sm-2 control-label">姓名</label>
        <div class="col-sm-4">
            <input name="name" type="text" class="form-control" id="inputName" placeholder="请输入您的姓名">
        </div>
    </div>
     <div class="form-group">
         <label for="inputName" class="col-sm-2 control-label">性别</label>
            <label class="radio-inline">
        <input type="radio" name="sex"  value="man" checked> 男
    </label>
    <label class="radio-inline">
        <input type="radio" name="sex"   value="woman"> 女
    </label>
        </div>
    <div class="form-group">
        <label  class="col-sm-2 control-label">家乡</label>
        <select class=" col-sm-4" name="country">
            <option>大同</option>
            <option>北京</option>
            <option>广州</option>
            <option>深圳</option>
            <option>上海</option>
        </select>
    </div>

      <div class="form-group">
        <label class="col-sm-2 control-label" for="inputfile">上传照片</label>
        <input name="photoFile" type="file" id="inputfile" class="col-sm-4">
    </div>
        <button class="btn btn-lg btn-warning btn-block" type="submit">注册</button>
    </form>


9、Servlet获取前端提交的信息
@WebServlet("/userSubinfoAction")
@MultipartConfig
public class UserSubinfoAction extends HttpServlet{

    /**
     * 
     */
    private static final long serialVersionUID = 1L;

    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
        String savePath = req.getServletContext().getRealPath("/WEB-INF/uploadFile");
        System.out.println(savePath);
        req.setCharacterEncoding("utf-8");
        resp.setCharacterEncoding("utf-8");
        resp.setContentType("text/html;charset=utf-8");
        Part part = req.getPart("photoFile");
        String header = part.getHeader("content-disposition");
        System.out.println(header);
        part.write("F:/s.png");
        User user = new User();
        user.setUserName(req.getParameter("name"));
        user.setSex(req.getParameter("sex"));
        user.setCountry(req.getParameter("country"));
        user.setPhotoFile("F:/s.png");
        new UserService().subInfo(user);
    }
}

10、数据提交给业务层处理,
new UserService().subInfo(user);
1
2
在service层新建UserService类,可以在方法中处理提交来的数据:

public class UserService {
        public void subInfo(User user){
            new UserDao().savaUser(user);
        }
}

11、将数据提交给dao层,用于和数据库进行交互。
new UserDao().savaUser(user);


在dao层新建UserDao类,在方法中用于和数据库进行数据交互:

    public void savaUser(User user){
        Connection conn = DBConnect.getConn();

        String sql = "insert into user (username,sex,country,photo_file) values(?,?,?,?)";
        PreparedStatement pstmt;
        try {
            pstmt = (PreparedStatement) conn.prepareStatement(sql);
            pstmt.setString(1, user.getUserName());
            pstmt.setString(2, user.getSex());
            pstmt.setString(3, user.getCountry());
            pstmt.setString(4, user.getCountry());
           int i = pstmt.executeUpdate();
         if(i==1){
             System.out.println("注册成功");
         }else System.out.println("失败");
            pstmt.close();
            conn.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

补充:DBConnect类:

public class DBConnect {
    public static Connection getConn() {
        String driver = "com.mysql.jdbc.Driver";
        String url = "jdbc:mysql://localhost:3306/MavenWeb";
        String username = "root";
        String password = "root";
        Connection conn = null;
        try {
            Class.forName(driver); //classLoader,加载对应驱动
            conn = (Connection) DriverManager.getConnection(url, username, password);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return conn;
    }
}

整个注册的业务流程到现在就实现了,主要是为了快速搭建框架而记录,也穿插了一些小tips,这次的记录就到这里。

tips:

哪些是get方式呢?

form默认的提交方式 
如果通过一个超链访问某个地址 
如果在地址栏直接输入某个地址 
ajax指定使用get方式的时候

哪些是post方式呢?

在form上显示设置 method=”post”的时候 
ajax指定post方式的时候

others

在执行doGet()或者doPost()之前,都会先执行service()

由service()方法进行判断,到底该调用doGet()还是doPost()

Serlvet是单实例的(init和构造方法只会执行一次)
--------------------- 
作者:Lee_Tech 
来源:CSDN 
原文:https://blog.csdn.net/lk7688535/article/details/77650712 
版权声明:本文为博主原创文章,转载请附上博文链接!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值