学习《轻量级JavaEE企业应用实战》
使用Servlet作为表现层的工作量很大,所有HTML标签都需要使用页面输出流生成,因此使用Servlet作为表现层有以下劣势:
- 开发效率低,所有HTML标签使用页面输出流输出
- 不利于团队协作开发,美工人员无法参与Servlet界面的开发
- 程序可维护性差,即是修改一个按钮都需要重新编译java代码,并重新编译。
在标准的MVC模式中,Servlet仅作为控制器。J2EE的架构也遵循MVC模式,如图
MVC的各角色对应组件:
- M:Model 即模型,对应JavaBean;实现业务逻辑、数据访问逻辑等
- V:View 即视图 ,对应JSP页面;
- C : Controller即控制器,对应Servlet;其作用类似调度员:所有请求发送给Servlet,Servlet调用Model来处理请求,并调用JS呈现处理结果;或者Servlet直接调用JSP将应用的状态数据呈现给用户。
使用Servlet作为控制器的例子—登录验证
视图(V):JSP
<%@ page contentType="text/html;charset=gb2312" language="java" errorPage="" %>
<html>
<head>
<title>Login</title>
</head>
<body>
<!--输出错误提示-->
<font color="red">
<%
if(request.getAttribute("err")!=null)
out.println(request.getAttribute("err"));
%>
</font>
请输入用户名和密码:
<form id="login" method="post" action="loginServlet">
用户名:<input type="text" name="username"/><br>
密   码:<input type="password" name="pass"/><br>
<input type="submit" value="登录"/><br>
</form>
</body>
</html>
控制器(C):Servlet
package lee;
import javax.servlet.http.*;
import javax.servlet.*;
import java.io.*;
import java.sql.*;
public class LoginServlet extends HttpServlet{
public void service(HttpServletRequest request,HttpServletResponse response)
throws ServletException,java.io.IOException{
String errMsg=" ";
RequestDispatcher rd;
String username=request.getParameter("username");
String pass=request.getParameter("pass");
try{
DbDao dd=DbDao.instance("com.mysql.jdbc.Driver","jdbc:mysql://localhost/test","root","1234");
ResultSet rs=dd.query("select pass from user_servlet where name='"+username+"';");
if(rs.next()){
if(rs.getString("pass").equals(pass)){
HttpSession session=request.getSession(true);
session.setAttribute("name",username);
System.out.println("...........");
rd=request.getRequestDispatcher("/welcome.jsp");
rd.forward(request,response);
return;
}
else{
errMsg+="用户名密码不符合,请重新输入";
}
}
else{
errMsg+="您的用户名不存在,请先注册";
}
}
catch(Exception e){
e.printStackTrace();
}
if(errMsg!=null &!errMsg.equals("")){
rd=request.getRequestDispatcher("/login.jsp");
request.setAttribute("err",errMsg);
rd.forward(request,response);
return;
}
}
}
模型(M):JavaBean
package lee;
import java.sql.*;
public class DbDao{
private static DbDao op;
private Connection conn;
private String driver;
private String url;
private String username;
private String pass;
private DbDao(){
}
private DbDao(String driver,String url,String username,String pass)throws Exception{
this.driver=driver;
this.url=url;
this.username=username;
this.pass=pass;
Class.forName(driver);
conn=DriverManager.getConnection(url,username,pass);
}
public void setDriver(String driver){
this.driver=driver;
}
public void setUrl(String url){
this.url=url;
}
public void setUsername(String username){
this.username=username;
}
public void setPass(String pass){
this.pass=pass;
}
public String getDriver(){
return driver;
}
public String getUrl(){
return url;
}
public String getUsername(){
return username;
}
public String getPass(){
return pass;
}
public void getConnection()throws Exception{
if(conn==null){
Class.forName(this.driver);
conn=DriverManager.getConnection(url,username,this.pass);
}
}
public static DbDao instance(){
if(op==null){
op=new DbDao();
}
return op;
}
public static DbDao instance(String driver,String url,String username,String pass) throws Exception{
if(op==null){
op=new DbDao(driver,url,username,pass);
}
return op;
}
public boolean insert(String sql)throws Exception{
getConnection();
Statement stmt=this.conn.createStatement();
if(stmt.executeUpdate(sql)!=1){
return false;
}
return true;
}
public ResultSet query(String sql)throws Exception{
getConnection();
Statement stmt=this.conn.createStatement();
return stmt.executeQuery(sql);
}
public void delete(String sql)throws Exception{
getConnection();
Statement stmt=this.conn.createStatement();
stmt.executeUpdate(sql);
}
public void update(String sql)throws Exception{
getConnection();
Statement stmt=this.conn.createStatement();
stmt.executeUpdate(sql);
}
}
其中web.xml的配置:
<servlet>
<servlet-name>loginServlet</servlet-name>
<servlet-class>lee.LoginServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>loginServlet</servlet-name>
<url-pattern>/loginServlet</url-pattern>
</servlet-mapping>
运行情况:
运行部署的时候会出现以下问题:
- web通过jdbc调用MySQL,需要将MySQL的包放入tomcat的lib目录下,重启tomcat
- 然后一直报错:java.lang.NoClassDefFoundError: lee/DbDao,查询得知是少包jaxrpc.jar,将其放入tomcat的lib目录,重启tomcat。
- 当运行的时候,报错:”java.lang.IllegalStateException: Cannot forward after response has been committed“,当有多个跳转页面的时候,需要在后边加一个return。服务器中不允许多次跳转。太不智能了!
感觉这种需要手动加包太繁琐,可以考虑用maven,但需要进一步学习