项目介绍
一个简单的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
版权声明:本文为博主原创文章,转载请附上博文链接!