MVC Sessionid问题

龟叔啊 2018-05-04 10:56:53
本人最近开发一个MVC4项目,项目的使用角色有学生和老师,所以登录页面存在两个登录表单,分别有两个登录验证码
登录界面如图:




两种角色登录验证码使用session分别保存。视图逻辑代码如下:
两个<img>指向一个获取验证码图片的流地址:

<img src="/Admin/Account/NumberValidateImg?userType=teacher" id="teachervalidimg" class="login-code" onclick="ShowValidate('teacher')" />
<img src="/Admin/Account/NumberValidateImg?userType=student" id="studentvalidimg" class="login-code" onclick="ShowValidate('student')" />


服务端生成验证码代码:

//控制器生成登录验证码
public FileContentResult NumberValidateImg(string userType)
{
ValidateCode validateCode = new ValidateCode();
var ms = validateCode.CreateNumberCode(userType, 4);
Response.BinaryWrite(ms.ToArray());
return File(ms.ToArray(), MediaTypeNames.Image.Jpeg);
}




validateCode类中的生成方法,注意这里我用session保存了验证码,以便后续进行登录验证


/// <summary>
/// 创建数字验证码
/// </summary>
/// <param name="textLength">数字的长度</param>
/// <returns>返回图片内存流</returns>
public MemoryStream CreateNumberCode(string strUserType,int textLength)
{
int ranCount = textLength;
string outcode = "";
Random ran = new Random();
for (int h = 0; h < ranCount; h++)
{
outcode += ran.Next(9).ToString();
}
MemoryStream m = CreateTextImage(outcode);
HttpContext.Current.Session[strUserType+"ValidateImgCode"] = outcode;
return m;
}

具体生成验证码的内容这里我就不贴了。

不同用户点击登录时异步提交到同一个控制器的不同action中验证,以下是教师登录验证代码:

[AnonymousAttribute]
[HttpPost]
public JsonResult TeacherLogin([Bind(Prefix = "Teacher")] TeacherLoginModel model)
{
try
{
model.IsRemind = false;
//验证码开启状态
if (!new ValidateCode().IsUseValidate)
ModelState.Remove("Teacher.ValidateCode");
if (!ModelState.IsValid)
{
foreach (var state in ModelState)
{
foreach (var err in state.Value.Errors)
{
return Json(new
{
Code = "-1",
Desc = err.ErrorMessage
});
}
}
}
//登录
AdminSystemLogin adminSystemLogin = new AdminSystemLogin(model.UserName, model.Password, model.ValidateCode, model.IsRemind);
var response = adminSystemLogin.Login();
return Json(response);
}
catch (Exception ex)
{
return Json(new
{
Code = "-1",
Desc = ex.Message
});
}
}


adminSystemLogin.Login()里是具体登录验证,代码如下:

public ResponseModel Login()
{
ResponseModel response = new ResponseModel();
response.Code = "0";
response.Desc = "效验成功";
//验证码效验
if (_validateCode.IsUseValidate) {
if (!_validateCode.ValidateImgCode("teacher",this.validateCode)) {
response.Code = "-1";
response.Desc = "验证码错误";
return response;
}
}
.....................................
return response;
}

_validateCode.ValidateImgCode()方法验证代码如下:

/// <summary>
/// 验证码效验
/// </summary>
/// <param name="validateCode">用户输入的验证码</param>
/// <returns></returns>
public bool ValidateImgCode(string strUserType,string validateCode)
{
bool result = true;
if (HttpContext.Current.Session[strUserType+"ValidateImgCode"] == null || !string.Equals(HttpContext.Current.Session[strUserType+"ValidateImgCode"].ToString(), validateCode, StringComparison.OrdinalIgnoreCase))
{
result = false;
}
return result;
}


现在开始描述问题,使用时发现用户第一次访问网站(无cookie记录)第一次点击教师角色登录时验证码永远提示错误,再次更改验证码点击登录成功,通过服务端代码跟踪发现教师和学生保存的验证码sessionid竟然不同,而浏览器cookie显示的sessionid是学生验证码保存的sessionid,再次通过浏览器调试发现教师验证码请求时request headers头部没有包含set-cookie的sessionid信息而第二个请求学生验证码的图片确有附带sessionid信息,调试代码截图如下:










从上面的截图可以看出两次请求sessionid不同,且浏览器cookie最终保存的sessionid是学生验证码的那个请求返回的sessionid,这造成了教师登录验证时取对应session的值是空的:



当然网上的解决方案可以搜到,就是在Global.asax文件中加入session_start和session_end事件:


protected void Session_Start(object sender, EventArgs e)
{
//加入这个方法是为了解决第一次请求sessionid变化问题,具体原因未知
}

protected void Session_End(object sender, EventArgs e)
{
//加入这个方法是为了解决第一次请求sessionid变化问题,具体原因未知
}


我想问的问题是:1:为什么sessionid会变化?2.为什么使用了那两个事件就可以了。这其中的原理是什么,请大神赐教!

...全文
838 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
(即使是)不同的ie(或者其它浏览器)窗口进程也是使用同一套cookie,这个你不会不知道吧? 你怎么做到两个身份的人在你的电脑桌面同时登录?
  • 打赏
  • 举报
回复
在 html5 发布了这么多年的时代背景下,其实使用 h5 客户端存储机制,而不应该使用 cookie 了。我不知道别的公司对前端有没有这个基本要求,我们是从来关心 cookie。
引用 9 楼 heather_suyisi 的回复:
谢谢回答,应该是你讲的符合逻辑,另外你说的应该在返回登陆页时就开启session,所谓开启是指在登陆显示action中设置一个session (即使存一个空值)是吗?还有我发现如果没有登陆验证码浏览器cookie就没有存储sessionid是不是说如果服务端没有使用session那么就不会创建sessionid?
如果没往Session集合里边写东西,那么asp.net 的SessionID 就是随机变化的,还不能使用。只有服务器端先往Session集合里边保存东西,才能期望以后正常使用Session(其实这个逻辑很自然),此时SessionID才稳定不变。这个是 asp.net 的经常考试的知识。
xuzuning 2018-05-05
  • 打赏
  • 举报
回复
我不知道你的 MVC 是如何启用 Session 的 是否是向 HttpContext.Current.Session 赋值就算启用了? 如果是,那你就在生成登录页面的代码里赋值一个,比如时间 总之应在登录画面出现时就出现 Set-Cookie: ASP.NET_SessionId=...............
  • 打赏
  • 举报
回复
那两个问题是次要的。你说你分别使用两个登录页面,别说是两个页面,就算是同时i可打开两个浏览器进程,其 SessionID 也是相同的,那么也是最多只能支持一个人登录!!!!
  • 打赏
  • 举报
回复
如果你说的是“SessionID为空”的情况,那么对于 asp.net 来说,要先在服务器往Session集合写内容,然后才能使用。你确保两个测试,每一个页面在下载时都事先向服务器端 Session 集合写了内容了吗?分别贴出调试信息来看看。 我其实已经说了,不要使用 Sesson 集合,这样就能避开有关Session的许多问题(例如Session 内容容易丢失的问题)。缓存数据写到Cache 中就可以了,而使用 SessonID就可以用来访问 Cache 的各种用户身份数据,修改数据时应该实时写入数据库、并且用Cache作为缓存,完全用不着经常自动就丢失数据的 Session 集合。
龟叔啊 2018-05-05
  • 打赏
  • 举报
回复
引用 12 楼 sp1234 的回复:
在 html5 发布了这么多年的时代背景下,其实使用 h5 客户端存储机制,而不应该使用 cookie 了。我不知道别的公司对前端有没有这个基本要求,我们是从来关心 cookie。 [quote=引用 9 楼 heather_suyisi 的回复:] 谢谢回答,应该是你讲的符合逻辑,另外你说的应该在返回登陆页时就开启session,所谓开启是指在登陆显示action中设置一个session (即使存一个空值)是吗?还有我发现如果没有登陆验证码浏览器cookie就没有存储sessionid是不是说如果服务端没有使用session那么就不会创建sessionid?
如果没往Session集合里边写东西,那么asp.net 的SessionID 就是随机变化的,还不能使用。只有服务器端先往Session集合里边保存东西,才能期望以后正常使用Session(其实这个逻辑很自然),此时SessionID才稳定不变。这个是 asp.net 的经常考试的知识。[/quote] 问题是我们开发的某些网站还不全在html5下运行。尤其是IE浏览器简直是个灾难。
龟叔啊 2018-05-05
  • 打赏
  • 举报
回复
引用 11 楼 sp1234 的回复:
(即使是)不同的ie(或者其它浏览器)窗口进程也是使用同一套cookie,这个你不会不知道吧? 你怎么做到两个身份的人在你的电脑桌面同时登录?
谢谢回答,我没有要实现两个身份同时在一台登录,只是给他个选择而已。另外你说的没有往Session存东西sessionid就会随机变化,我的理解是如果没有使用session存东西,服务端不会产生sessionid并返回给客户端,我测试看到的结果也是这样的,除非你在Global.asax文件中加入session_start和session_end事件这是即使你没有使用session服务端也会创建sessionid给客户端,不知道我测试或者理解有误?
龟叔啊 2018-05-05
  • 打赏
  • 举报
回复
引用 6 楼 xuzuning的回复:
原因是你的登录页面没有 sessionid,验证时所需的 sessionid 是由 验证码图片连接产生的 连接或ajax 会携带 cookie,但你的两个验证码图片连接都因没有初始的cookie可携带,从而会有两个 sessionid 被返回 <img src="/Admin/Account/NumberValidateImg?userType=teacher" id="teachervalidimg" class="login-code" onclick="ShowValidate('teacher')" /> <img src="/Admin/Account/NumberValidateImg?userType=student" id="studentvalidimg" class="login-code" onclick="ShowValidate('student')" /> 对浏览器而言是同时发出请求的的,但不能知道谁会先返回
谢谢回答,应该是你讲的符合逻辑,另外你说的应该在返回登陆页时就开启session,所谓开启是指在登陆显示action中设置一个session (即使存一个空值)是吗?还有我发现如果没有登陆验证码浏览器cookie就没有存储sessionid是不是说如果服务端没有使用session那么就不会创建sessionid?
龟叔啊 2018-05-05
  • 打赏
  • 举报
回复
引用 5 楼 正怒月神的回复:
“不同用户点击登录时异步提交到同一个控制器的不同action中验证” 既然你使用了异步。那么就和sessionid没有关系了。 因为异步默认是不会携带 cookie的,所以更加不会有sessionid了。
谢谢回答,如果根据你的思路来讲,为啥根据网上的设置后,同样异步登陆就可以了取到session 值了?异步是否携带session id我明天可以验证下。
正怒月神 2018-05-04
  • 打赏
  • 举报
回复
“不同用户点击登录时异步提交到同一个控制器的不同action中验证” 既然你使用了异步。那么就和sessionid没有关系了。 因为异步默认是不会携带 cookie的,所以更加不会有sessionid了。
  • 打赏
  • 举报
回复
引用 2 楼 heather_suyisi 的回复:
[quote=引用 1 楼 xomix 的回复:] 1:为什么sessionid会变化? 因为在默认状态下,一个浏览器请求和这个浏览器请求内的ajax是不同的请求,会获取到不同的session id。
图片的请求应该不属于ajax请求吧?[/quote] 这个就没有具体试过了,mvc5之后我没有再用过session,因为这东西对于mvc5来说属于过时的。
龟叔啊 2018-05-04
  • 打赏
  • 举报
回复
引用 1 楼 xomix 的回复:
1:为什么sessionid会变化? 因为在默认状态下,一个浏览器请求和这个浏览器请求内的ajax是不同的请求,会获取到不同的session id。
再说ajax请求也会附带sessionid吧?
龟叔啊 2018-05-04
  • 打赏
  • 举报
回复
引用 1 楼 xomix 的回复:
1:为什么sessionid会变化? 因为在默认状态下,一个浏览器请求和这个浏览器请求内的ajax是不同的请求,会获取到不同的session id。
图片的请求应该不属于ajax请求吧?
  • 打赏
  • 举报
回复
1:为什么sessionid会变化? 因为在默认状态下,一个浏览器请求和这个浏览器请求内的ajax是不同的请求,会获取到不同的session id。 2.为什么使用了那两个事件就可以了。 这两个事件我第一次见到,因为以前解决这个都是用token的,我查了很久没找到这两个事件的作用,我认为这两个事件应该是将浏览器内的所有请求视为一个请求的一种服务端配置方法吧。
xuzuning 2018-05-04
  • 打赏
  • 举报
回复
你只要在产生登录表单页面时就开启 Session 就可以了 那两个 验证码图片连接 都会携带这个预置的 sessionid 当然 Session 中的两个验证码值是需要分别保存的
xuzuning 2018-05-04
  • 打赏
  • 举报
回复
原因是你的登录页面没有 sessionid,验证时所需的 sessionid 是由 验证码图片连接产生的 连接或ajax 会携带 cookie,但你的两个验证码图片连接都因没有初始的cookie可携带,从而会有两个 sessionid 被返回 <img src="/Admin/Account/NumberValidateImg?userType=teacher" id="teachervalidimg" class="login-code" onclick="ShowValidate('teacher')" /> <img src="/Admin/Account/NumberValidateImg?userType=student" id="studentvalidimg" class="login-code" onclick="ShowValidate('student')" /> 对浏览器而言是同时发出请求的的,但不能知道谁会先返回
弃用了struts,用spring mvc框架做了几个项目,感觉都不错,而且使用了注解方式,可以省掉一大堆配置文件。本文主要介绍使用注解方式配置的spring mvc,之前写的spring3.0 mvc和rest小例子没有介绍到数据层的内容,现在这一篇补上。下面开始贴代码。 文中用的框架版本:spring 3,hibernate 3,没有的,自己上网下。 先说web.xml配置: [java] view plaincopy 01.<?xml version="1.0" encoding="UTF-8"?> 02. 03. s3h3 04. 05. contextConfigLocation 06. classpath:applicationContext*.xml 07. 08. 09. org.springframework.web.context.ContextLoaderListener 10. 11. 12. 13. spring 14. org.springframework.web.servlet.DispatcherServlet 15. 1 16. 17. 18. spring <!-- 这里在配成spring,下边也要写一个名为spring-servlet.xml的文件,主要用来配置它的controller --> 19. *.do 20. 21. 22. index.jsp 23. 24. spring-servlet,主要配置controller的信息 [java] view plaincopy 01.<?xml version="1.0" encoding="UTF-8"?> 02. 09. 10. 11. <!-- 把标记了@Controller注解的类转换为bean --> 12. 13. <!-- 启动Spring MVC的注解功能,完成请求和注解POJO的映射 --> 14. 15. 16. <!-- 对模型视图名称的解析,即在模型视图名称添加前后缀 --> 17. 19. 20. 23. applicationContext.xml代码 [java] view plaincopy 01.<?xml version="1.0" encoding="UTF-8"?> 02. 11. 12. 13. <!-- 自动扫描所有注解该路径 --> 14. 15. 16. 17. 19. 20. 21. 22. ${dataSource.dialect} 23. ${dataSource.hbm2ddl.auto} 24. update 25. 26. 27. 28. 29. com.mvc.entity<!-- 扫描实体类,也就是平时所说的model --> 30. 31. 32. 33. 34. 36. 37. 38. 39. 40. 42. 43. 44. 45. 46. 47. <!-- Dao的实现 --> 48. 49. 50. 51. 52. 53. 54. 55. hibernate.properties数据库连接配置 [java] view plaincopy 01.dataSource.password=123 02.dataSource.username=root 03.dataSource.databaseName=test 04.dataSource.driverClassName=com.mysql.jdbc.Driver 05.dataSource.dialect=org.hibernate.dialect.MySQL5Dialect 06.dataSource.serverName=localhost:3306 07.dataSource.url=jdbc:mysql://localhost:3306/test 08.dataSource.properties=user=${dataSource.username};databaseName=${dataSource.databaseName};serverName=${dataSource.serverName};password=${dataSource.password} 09.dataSource.hbm2ddl.auto=update 配置已经完成,下面开始例子 先在数据库建表,例子用的是mysql数据库 [java] view plaincopy 01.CREATE TABLE `test`.`student` ( 02. `id` int(10) unsigned NOT NULL AUTO_INCREMENT, 03. `name` varchar(45) NOT NULL, 04. `psw` varchar(45) NOT NULL, 05. PRIMARY KEY (`id`) 06.) 建好表后,生成实体类 [java] view plaincopy 01.package com.mvc.entity; 02. 03.import java.io.Serializable; 04. 05.import javax.persistence.Basic; 06.import javax.persistence.Column; 07.import javax.persistence.Entity; 08.import javax.persistence.GeneratedValue; 09.import javax.persistence.GenerationType; 10.import javax.persistence.Id; 11.import javax.persistence.Table; 12. 13.@Entity 14.@Table(name = "student") 15.public class Student implements Serializable { 16. private static final long serialVersionUID = 1L; 17. @Id 18. @Basic(optional = false) 19. @GeneratedValue(strategy = GenerationType.IDENTITY) 20. @Column(name = "id", nullable = false) 21. private Integer id; 22. @Column(name = "name") 23. private String user; 24. @Column(name = "psw") 25. private String psw; 26. public Integer getId() { 27. return id; 28. } 29. public void setId(Integer id) { 30. this.id = id; 31. } 32. 33. public String getUser() { 34. return user; 35. } 36. public void setUser(String user) { 37. this.user = user; 38. } 39. public String getPsw() { 40. return psw; 41. } 42. public void setPsw(String psw) { 43. this.psw = psw; 44. } 45.} Dao层实现 [java] view plaincopy 01.package com.mvc.dao; 02. 03.import java.util.List; 04. 05.public interface EntityDao { 06. public List<Object> createQuery(final String queryString); 07. public Object save(final Object model); 08. public void update(final Object model); 09. public void delete(final Object model); 10.} [java] view plaincopy 01.package com.mvc.dao; 02. 03.import java.util.List; 04. 05.import org.hibernate.Query; 06.import org.springframework.orm.hibernate3.HibernateCallback; 07.import org.springframework.orm.hibernate3.support.HibernateDaoSupport; 08. 09.public class EntityDaoImpl extends HibernateDaoSupport implements EntityDao{ 10. public List<Object> createQuery(final String queryString) { 11. return (List<Object>) getHibernateTemplate().execute( 12. new HibernateCallback<Object>() { 13. public Object doInHibernate(org.hibernate.Session session) 14. throws org.hibernate.HibernateException { 15. Query query = session.createQuery(queryString); 16. List<Object> rows = query.list(); 17. return rows; 18. } 19. }); 20. } 21. public Object save(final Object model) { 22. return getHibernateTemplate().execute( 23. new HibernateCallback<Object>() { 24. public Object doInHibernate(org.hibernate.Session session) 25. throws org.hibernate.HibernateException { 26. session.save(model); 27. return null; 28. } 29. }); 30. } 31. public void update(final Object model) { 32. getHibernateTemplate().execute(new HibernateCallback<Object>() { 33. public Object doInHibernate(org.hibernate.Session session) 34. throws org.hibernate.HibernateException { 35. session.update(model); 36. return null; 37. } 38. }); 39. } 40. public void delete(final Object model) { 41. getHibernateTemplate().execute(new HibernateCallback<Object>() { 42. public Object doInHibernate(org.hibernate.Session session) 43. throws org.hibernate.HibernateException { 44. session.delete(model); 45. return null; 46. } 47. }); 48. } 49.} Dao在applicationContext.xml注入 Dao只有一个类的实现,直接供其它service层调用,如果你想更换为其它的Dao实现,也只需修改这里的配置就行了。 开始写view页面,WEB-INF/view下新建页面student.jsp,WEB-INF/view这路径是在spring-servlet.xml文件配置的,你可以配置成其它,也可以多个路径。student.jsp代码 [xhtml] view plaincopy 01.<%@ page language="java" contentType="text/html; charset=UTF-8" 02. pageEncoding="UTF-8"%> 03.<%@ include file="/include/head.jsp"%> 04. 05.<html> 06.<head> 07.<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 08.<title>添加</title> 09. 11.// --><!-- 13.table{ border-collapse:collapse; } 14.td{ border:1px solid #f00; } 15.--><style mce_bogus="1">table{ border-collapse:collapse; } 16.td{ border:1px solid #f00; }</style> 17.<!-- 18.function add(){ 19. [removed].href="<%=request.getContextPath() %>/student.do?method=add"; 20.} 21. 22.function del(id){ 23.$.ajax( { 24. type : "POST", 25. url : "<%=request.getContextPath()%>/student.do?method=del&id;=" + id, 26. dataType: "json", 27. success : function(data) { 28. if(data.del == "true"){ 29. alert("删除成功!"); 30. $("#" + id).remove(); 31. } 32. else{ 33. alert("删除失败!"); 34. } 35. }, 36. error :function(){ 37. alert("网络连接出错!"); 38. } 39.}); 40.} 41.// --> 47. 48. 序号 49. 姓名 50. 密码 51. 操作 52. 53. 54. "> 55. 56. 57. 58. 59. <input type="button" value="编辑"/> 60. <input type="button" value="${student.id}"/>')" value="删除"/> 61. 62. 63. 64. 65. 66.</body> 67.</html> student_add.jsp [xhtml] view plaincopy 01.<%@ page language="java" contentType="text/html; charset=UTF-8" 02. pageEncoding="UTF-8"%> 03.<%@ include file="/include/head.jsp"%> 04. 05.<html> 06.<head> 07.<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 08.<title>学生添加</title> 09.<!-- 10.function turnback(){ 11. [removed].href="<%=request.getContextPath() %>/student.do"; 12.} 13.// --> 17.
18. 19. 20. 21. 22.
姓名<input id="user" name="user" type="text" /></td>
密码<input id="psw" name="psw" type="text" /></td>
<input type="submit" value="提交"/><input type="button" value="返回" />
23. 24.</form> 25.</body> 26.</html> controller类实现,只需把注解写上,spring就会自动帮你找到相应的bean,相应的注解标记意义,不明白的,可以自己查下@Service,@Controller,@Entity等等的内容。 [java] view plaincopy 01.package com.mvc.controller; 02. 03.import java.util.List; 04. 05.import javax.servlet.http.HttpServletRequest; 06.import javax.servlet.http.HttpServletResponse; 07. 08.import org.apache.commons.logging.Log; 09.import org.apache.commons.logging.LogFactory; 10.import org.springframework.beans.factory.annotation.Autowired; 11.import org.springframework.stereotype.Controller; 12.import org.springframework.ui.ModelMap; 13.import org.springframework.web.bind.annotation.RequestMapping; 14.import org.springframework.web.bind.annotation.RequestMethod; 15.import org.springframework.web.bind.annotation.RequestParam; 16.import org.springframework.web.servlet.ModelAndView; 17. 18.import com.mvc.entity.Student; 19.import com.mvc.service.StudentService; 20. 21.@Controller 22.@RequestMapping("/student.do") 23.public class StudentController { 24. protected final transient Log log = LogFactory 25. .getLog(StudentController.class); 26. @Autowired 27. private StudentService studentService; 28. public StudentController(){ 29. 30. } 31. 32. @RequestMapping 33. public String load(ModelMap modelMap){ 34. List<Object> list = studentService.getStudentList(); 35. modelMap.put("list", list); 36. return "student"; 37. } 38. 39. @RequestMapping(params = "method=add") 40. public String add(HttpServletRequest request, ModelMap modelMap) throws Exception{ 41. return "student_add"; 42. } 43. 44. @RequestMapping(params = "method=save") 45. public String save(HttpServletRequest request, ModelMap modelMap){ 46. String user = request.getParameter("user"); 47. String psw = request.getParameter("psw"); 48. Student st = new Student(); 49. st.setUser(user); 50. st.setPsw(psw); 51. try{ 52. studentService.save(st); 53. modelMap.put("addstate", "添加成功"); 54. } 55. catch(Exception e){ 56. log.error(e.getMessage()); 57. modelMap.put("addstate", "添加失败"); 58. } 59. 60. return "student_add"; 61. } 62. 63. @RequestMapping(params = "method=del") 64. public void del(@RequestParam("id") String id, HttpServletResponse response){ 65. try{ 66. Student st = new Student(); 67. st.setId(Integer.valueOf(id)); 68. studentService.delete(st); 69. response.getWriter().print("{/"del/":/"true/"}"); 70. } 71. catch(Exception e){ 72. log.error(e.getMessage()); 73. e.printStackTrace(); 74. } 75. } 76.} service类实现 [java] view plaincopy 01.package com.mvc.service; 02. 03.import java.util.List; 04. 05.import org.springframework.beans.factory.annotation.Autowired; 06.import org.springframework.stereotype.Service; 07.import org.springframework.transaction.annotation.Transactional; 08. 09.import com.mvc.dao.EntityDao; 10.import com.mvc.entity.Student; 11. 12.@Service 13.public class StudentService { 14. @Autowired 15. private EntityDao entityDao; 16. 17. @Transactional 18. public List<Object> getStudentList(){ 19. StringBuffer sff = new StringBuffer(); 20. sff.append("select a from ").append(Student.class.getSimpleName()).append(" a "); 21. List<Object> list = entityDao.createQuery(sff.toString()); 22. return list; 23. } 24. 25. public void save(Student st){ 26. entityDao.save(st); 27. } 28. public void delete(Object obj){ 29. entityDao.delete(obj); 30. } 31.} OK,例子写完。有其它业务内容,只需直接新建view,并实现相应comtroller和service就行了,配置和dao层的内容基本不变,也就是每次只需写jsp(view),controller和service调用dao就行了。 怎样,看了这个,spring mvc是不是比ssh实现更方便灵活。

110,533

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧