本周是软工方面夏季学期的第一周,前三天我们在东软讲师刘老师的带领下完成了接下来的日子中需要的编程软件MyEclipse和数据库应用软件Navicat for MySQL以及相关环境的配置安装,并在后来的学习中逐步回顾了曾在数据库原理课程中学习过的SQL语句及其使用。
课堂上刘老师带领我们对JDBC、Java Servlet等常用编程框架作了了解,并讲授了不少软件的使用和编码的快速补全技巧,如:
在编程中可以通过快捷键 alt+shift+s 快速生成常用的 get()、set()或是构造方法
在实际开发过程中不少代码都可以通过快捷键 alt+/ 进行快速补全,如最常用的输出语句 System.out.println()就可以通过 syso 关键字加快捷键的操作快速补全。其他时候这一快捷键也能得到经常性的应用,并且通过快捷键进行补全的代码会自动导入所需要的包,不需要再手动一个个字符输入,能够大大提升编程效率。
另外我们还创建了一个自己的在后续课程内容中经常使用的数据库mybatis,并通过代码实现对其进行连接、访问、查询、关闭连接等操作,下面附上代码
//驱动加载
static{
try { Class.forName(DRIVER); }
catch (ClassNotFoundException e) { e.printStackTrace(); }
}
//获取连接
public static void getConnection(){
try { con = DriverManager.getConnection(URL, UNAME, UPWD); }
catch (SQLException e) { e.printStackTrace(); }
}
//关闭连接
public static void closeAll(){
if(null!=rs){
try { rs.close(); }
catch (SQLException e) { e.printStackTrace(); }
}
if(null!=ps){
try { ps.close(); }
catch (SQLException e) { e.printStackTrace(); }
}
if(null!=con){
try { con.close(); }
catch (SQLException e) { e.printStackTrace(); }
}
}
//查询操作
public static ResultSet executeQuery(String sql,Object[] obj){
getConnection();
//System.out.println(obj);
//如果SQL语句不够完整,是需要进行拼接的
try { ps = con.prepareStatement(sql);
if(null!=obj){
for(int i=0;i<obj.length;i++){ ps.setObject(i+1, obj[i]); }
}
rs = ps.executeQuery();
}
catch (SQLException e) { e.printStackTrace(); }
return rs;
}
//统一的执行增 删 改操作的方法 insert delete update
public static int executeUpdate(String sql,Object[] obj){
int count = 0;
getConnection();//调用上面的连接方法获得与数据库的连接
try { ps = con.prepareStatement(sql);
if(null!=obj){
for(int i=0;i<obj.length;i++){ ps.setObject(i+1, obj[i]); }
}
count = ps.executeUpdate();
}
catch (SQLException e) { e.printStackTrace(); }
finally{ closeAll(); }
return count;
}
通过以上方法我们实现了程序对数据库内容的访问和更新,并且通过接口UserinfoDao及其具体实现类以各类调用上述方法的方法实现了可以具体使用的功能,下面附上方法名
//插入用户信息,Userinfo 实体类携带用户信息
public boolean addUser(Userinfo userinfo);
//根据 用户姓名 修改 用户密码
public boolean updateUser(Userinfo userinfo);
//根据 用户姓名 删除 用户信息
public boolean deleteUser(String username);
//查询所有用户信息
public List<Userinfo> findAll();
//根据用户名查询,基于实际情况,1个用户名只对应1个用户,因此只能查到1条记录
//所以可以不使用 list 而直接使用 Userinfo 作为方法返回类型
public Userinfo findByUsername(String username);
在前面的基础上,我们进一步创建了servlet框架的web工程,通过软件将代码发布到Tomcat服务器上并通过网页访问和使用代码,实现了网页页面和数据库内容通过代码层进行联通显示使用的目的。我们创建的数据库保存的是一些人员的信息,包括用户ID userid,用户名username和密码pwd,通过web工程及代码我们实现了通过网页访问相关端口和下辖地址进行用户登录、显示用户信息等功能,下面附上代码
public class LoginAction extends HttpServlet {
//如果具体页面文件里的方法写的是 get 那么尽可能在doGet里写具体方法 反之写的post 就在doPost里面写方法
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html");
response.setCharacterEncoding("utf-8");
request.setCharacterEncoding("utf-8");
//获取页面中输入的信息 request.getParameter("username") username 是对应的网页中 input框的 name
String username = request.getParameter("username");
String pwd = request.getParameter("pwd");
System.out.println("获取的用户名"+username);
System.out.println("获取的密码"+pwd);
//乱码转换 可以将 ISO-8859-1 标准转为 utf-8 还可转换为别的形式
username = new String (username.getBytes("ISO-8859-1"),"utf-8");
System.out.println("转码之后的用户名:"+username);
UserinfoBiz biz = new UserinfoBizImpl();
String msg = biz.UserLogin(username, pwd);
//根据返回的结果,进行页面跳转
if(msg.equals("ok")){
request.setAttribute("uname", username);
request.getRequestDispatcher("WEB-INF/jsp/success.jsp").forward(request, response);
//WEB-INF目录下的文件不可通过网页直接输入地址访问,只能通过别的方法以“转发”的形式进行访问,若进入工程目录底下的这一jsp文件则说明触发了该“转发”,即访问成功了
}else if(msg.equals("unameErr")){
request.setAttribute("unameErr", "用户名错误!");
request.getRequestDispatcher("login.jsp")
.forward(request, response);
}else if(msg.equals("pwdErr")){
request.setAttribute("pwdErr", "密码错误!");
request.getRequestDispatcher("login.jsp").forward(request, response);
}
在具体的页面编写文件中,我们进行了如下内容的编辑:
//index.jsp
<body>
<a href="login.jsp">登陆</a><br/>
<!-- 上下是两种不同的表述方式,但意义均为点击两个<a>之间的汉字表示的连接后跳转入前面的地址 -->
<a href="http://localhost:8080/jspservlet_1/ListAllAciton">用户列表</a>
</body>
//login.jsp 此为实现检测用户输入内容进行登录的页面
<body>
<form action="LoginAction" method="get">
用户名:<input type="text" name="username" id="username"
placeholder="请输入账户" required="required"/>
<font color="red">${unameErr }</font>
<br/><!-- <br/>为换行符,实现页面中显示内容的换行 -->
<!-- required="required"表示此项必须填写,${ }为EL表达式 -->
密 码:<input type="password" name="pwd" id="pwd"
placeholder="请输入密码" required="required"/>
<font color="red">${pwdErr }</font>
<br/>
<input type="submit" value="登录"/>
</form>
</body>
//Users.jsp
<body>
<center><!-- 居中 -->
<h1>用户列表</h1>
<table border="1">
<tr>
<td>用户编号</td>
<td>用户名</td>
<td>用户密码</td>
</tr>
<!-- 第二行开始作信息显示,信息较多使用循环 -->
<!-- 这里使用了c标签,c:foreach标签items是用来接收数据的,var用于定义别名 -->
<c:forEach items="${users}" var="d">
<tr>
<!-- ${d.userid }中 . 后面的userid是Userinfo实体类中属性的名字,必须严格对应,对大小写敏感 -->
<td><a href="#">${d.userid}</a></td>
<td>${d.username}</td>
<td>${d.pwd}</td>
</tr>
</c:forEach>
</table>
</center>
</body>
通过几天的学习,我们在以往简单的编写方法和代码的基础上对软件的具体开发有了新的认识。以往都只是设计编写本地的一些小的程序,现在真正涉及到了能够具体用于项目级别开发的方法,像网页连接、数据库内容的使用等都是以前从未接触过的。
总的来讲近期所讲内容和以前的算法逻辑和程序编写相近,还是比较能够接受的,只是不同类和包之间的多次跳转对第一次接触较大型工程的我们来讲有些难以适应,希望后续的学习中能够获得更多有用的技能